从数组创建二叉树-Leetcode测试用

Leetcode里和二叉树相关的题目,都是用一个数组表示二叉树的,而这个数组是按照层次优先顺序给出的,连其中的空结点也表示了出来,刚好就是2^N-1个结点,N表示层数。

但数组毕竟无法和二叉树一样具有链式结构,无法进行算法测试,因此尝试直接通过这样的数组构建二叉树。

通过数组创建这样的二叉树,也通过层次优先构建。和遍历一样,都利用队列结构去迭代。

from collections import deque


class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

    def __eq__(self, other):
        return self.val == other.val

    def __str__(self):
        return str(self.val)

def build_bitree_fromarray(root_array):
    root_node = None
    if len(root_array) > 0:
        root_node = TreeNode(root_array[0])
    ind = 0
    dq = deque()
    dq.append(root_node)
    while len(dq) > 0:
        pre_node = dq.popleft()
        # print(f"{ind} -> ({(ind << 1) + 1}, {(ind << 1) + 2}) :: {root_array[ind]} -> ({root_array[(ind << 1) + 1]}, {root_array[(ind << 1) + 2]})")
        if (ind << 1) + 1 < len(root_array):
            if root_array[(ind << 1) + 1] != -1:
                tmp_node = TreeNode(root_array[(ind << 1) + 1])
                dq.append(tmp_node)
                pre_node.left = tmp_node
        if (ind << 1) + 2 < len(root_array):
            if root_array[(ind << 1) + 2] != -1:
                tmp_node = TreeNode(root_array[(ind << 1) + 2])
                dq.append(tmp_node)
                pre_node.right = tmp_node
        ind += 1
    return root_node


if __name__ == '__main__':
    root = [3, 5, 1, 6, 2, 0, 8, -1, -1, 7, 4]
    root_node = build_bitree_fromarray(root_array=root)
    print_tree_level(root_node)

打印也可以通过层次优先打印,要在创建的时候标记每一个结点的层数。

posted @ 2024-04-07 15:04  倦鸟已归时  阅读(99)  评论(0编辑  收藏  举报