leetcode バイナリ ツリー関連のトピックを取り上げる場合、次のような例がよく出てきます。
实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-balance-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
プログラムをローカルでデバッグしたい場合は、コードをデバッグするために対応するバイナリ ツリーを生成する必要があります。しかし、ツリーを生成するために毎回手動でノードを追加するのは非常に面倒です。
この例によれば、与えられるのは のような階層的な順序付きリストです[3,9,20,null,null,15,7]
。3 がルート ノード、9 と 20 が 3 の左右の子ノード、null と null が 9 の左右の子ノード、15 と 7 が 20 の左右の子ノードであることが直感的にわかります。 。
上記の説明から、左ノードと右ノードを割り当てる順序も 3、9、20 であることがわかります。これはリストの順序と一致しています。つまり、最初に左ノードと右ノードを 3 に割り当て、次に、左右のノードを 9 に割り当て、次に左右のノードを 20 に割り当てます。リストが長い場合は、null がスキップされ、15 が左右のノードに割り当てられ、7 が左右のノードに割り当てられます。ノード。
したがって、キューを使用して、バイナリ ツリーの初期化で先入れ先出し機能を実装できます。次の図は、キュー初期化のバイナリ ツリーのプロセスを示しています。
# 节点类
class Node(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
# 树生成代码
def generate_tree(vals):
if len(vals) == 0:
return None
que = [] # 定义队列
fill_left = True # 由于无法通过是否为 None 来判断该节点的左儿子是否可以填充,用一个记号判断是否需要填充左节点
for val in vals:
node = Node(val) if val is not None else None # 非空值返回节点类,否则返回 None
if len(que)==0:
root = node # 队列为空的话,用 root 记录根结点,用来返回
que.append(node)
elif fill_left:
que[0].left = node
fill_left = False # 填充过左儿子后,改变记号状态
if node: # 非 None 值才进入队列
que.append(node)
else:
que[0].right = node
if node:
que.append(node)
que.pop(0) # 填充完右儿子,弹出节点
fill_left = True #
return root
# 定义一个dfs打印中序遍历
def dfs(node):
if node is not None:
dfs(node.left)
print(node.val, end=' ')
dfs(node.right)
# 定义一个bfs打印层序遍历
def bfs(node):
que = []
que.append(node)
while que:
l = len(que)
for _ in range(l):
tmp = que.pop(0)
print(tmp.val, end=' ')
if tmp.left:
que.append(tmp.left)
if tmp.right:
que.append(tmp.right)
print('|', end=' ')
# test
null = None
vals = [3,9,20,null,null,15,7]
tree = generate_tree(vals)
print('中序遍历:')
dfs(tree) # 9 3 15 20 7
print('\n层序遍历:')
bfs(tree) # 3 | 9 20 | 15 7 |