LeetCode トピックでバイナリ ツリーを生成するにはどうすればよいですか? 指定された順序付きリストからバイナリ ツリーを生成します (Python)

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 が左右のノードに割り当てられます。ノード。
したがって、キューを使用して、バイナリ ツリーの初期化で先入れ先出し機能を実装できます。次の図は、キュー初期化のバイナリ ツリーのプロセスを示しています。

3つ入手してキューに入れます

1

9 を取得し、3 の左の息子に割り当て、キューに入れます。

2

20 を取得し、それを 3 の右側のノードに割り当て、キューに入れます。

3

3 左右のノードが割り当てられ、キューから飛び出す

4

null を取得し、9 の左側のノードに割り当てます。注: null はキューに入れられません。

5

nullを取得して9の右ノードに代入する

6

9 左右のノードが割り当てられ、キューから飛び出します

7

15 を取得し、20 の左の息子に割り当て、キューに入れます。

8

7 を取得し、20 の正しい息子に割り当て、キューに入れます。

9

20 左右のノードが割り当てられ、キューから飛び出します

10

新しい要素はないので、このステップではルート ノード 3 に戻ります。
最終的なコードは次のとおりです。
# 节点类
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 |

おすすめ

転載: blog.csdn.net/baoxin1100/article/details/108025393