面试的时候,面试官考了一道二叉树的题,让我们自己构造输入输出(白板,也叫ACM模式),然后发现题不难,但是不会构造输入输出,人傻了,本文基于这个问题,做一个解答。
我们还是拿一道题来说说: leetcode第515题:https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/
1、题目描述:
2、自己构造输入输出:
从二叉树 推导到 序列,大家可以发现这就是层序遍历。
但从序列 推导到 二叉树,很多同学就看不懂了,这得怎么转换呢。
二叉树可以有两种存储方式,一种是 链式存储,另一种是顺序存储。
那么此时我们应该知道,数组如何转化成 二叉树了。如果父节点的数组下标是
i
i
i,那么它的左孩子下标就是
i
?
2
+
1
i * 2 + 1
i?2+1,右孩子下标就是
i
?
2
+
2
i * 2 + 2
i?2+2。计算过程为:
如果父节点在第
k
k
k层,第
m
,
m
∈
[
0
,
2
k
]
m,m \in [0,2^k]
m,m∈[0,2k]个节点,则其左孩子所在的位置必然为
k
+
1
k+1
k+1层,第
2
?
(
m
?
1
)
+
1
2*(m-1)+1
2?(m?1)+1个节点。
计算父节点在数组中的索引:
i
n
d
e
x
f
a
t
h
e
r
=
(
∑
i
=
0
i
=
k
?
1
2
i
)
+
m
?
1
=
2
k
?
1
+
m
?
1
index_{father}=(\sum_{i=0}^{i=k-1}2^i)+m-1=2^k-1+m-1
indexfather?=(i=0∑i=k?1?2i)+m?1=2k?1+m?1
计算左子节点在数组的索引:
i
n
d
e
x
l
e
f
t
=
(
∑
i
=
0
i
=
k
2
i
)
+
2
?
m
?
1
?
1
=
2
k
+
1
+
2
m
?
3
index_{left}=(\sum_{i=0}^{i=k}2^i)+2*m-1-1=2^{k+1}+2m-3
indexleft?=(i=0∑i=k?2i)+2?m?1?1=2k+1+2m?3
故左孩子的下表为
i
n
d
e
x
l
e
f
t
=
i
n
d
e
x
f
a
t
h
e
r
×
2
+
1
index_{left}=index_{father}\times2+1
indexleft?=indexfather?×2+1,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上+1。
但是代码咋写呢?
具体过程看注释:
我们以下面这个二叉树为例子: 传入的序列为:[4,1,6,0,2,5,7,None,None,None,3,None,None,None,8] 二叉树长这样:
class Tree:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def max_value(self, root):
"""这道题的题解:层序遍历"""
res = []
import collections
q = collections.deque()
q.append(root)
while q:
size = len(q)
_max = q[0].val
for _ in range(size):
cur = q.popleft()
if _max < cur.val:
_max = cur.val
if cur.left: q.append(cur.left)
if cur.right: q.append(cur.right)
res.append(_max)
return res
def construct_binary_tree(nums):
"""根据数组构造二叉树"""
Treelist = [None for _ in range(len(nums))]
for i in range(len(nums)):
if nums[i] != None:
node = Tree(nums[i])
Treelist[i] = node
if i == 0: root = node
i = 0
while i * 2 + 2 < len(nums):
if Treelist[i] != None:
Treelist[i].left = Treelist[i * 2 + 1]
Treelist[i].right = Treelist[i * 2 + 2]
i += 1
return root
nums = [4,1,6,0,2,5,7,None,None,None,3,None,None,None,8]
root = construct_binary_tree(nums)
res = root.max_value(root)
print(res)
输出:
|