从 Python 列表构建二叉树

Joh*_*etz 5 python binary-tree

假设我有以下二叉树:

在此输入图像描述

以及以下TreeNode定义:

class TreeNode:
    def __init__(self, x, left: = None, right: = None):
        self.val = x
        self.left = left
        self.right = right
Run Code Online (Sandbox Code Playgroud)

为了构建这棵树,我目前需要编写以下代码:

def build_tree() -> TreeNode:
    node0 = TreeNode(2, left=TreeNode(4), right=TreeNode(5))
    node1 = TreeNode(3, right=TreeNode(7))
    root = TreeNode(1, left=node0, right=node1)
    return root
Run Code Online (Sandbox Code Playgroud)

这对于大树来说效率非常低。Leetcode 为我提供了 Python 列表形式的树。对于上面的例子,它写道:

[1, 2, 3, 4, 5, None, 7]
Run Code Online (Sandbox Code Playgroud)

我很想重构,build_tree所以它需要一个列表,构建树并返回根节点:

def build_tree(values: list) -> ListNode:
    ...
Run Code Online (Sandbox Code Playgroud)

关于如何创建这个功能有什么想法吗?

这是一个更复杂的例子:

[4, 6, 2, None, 5, 1, 9, 2, 1, 3, 4, None, 7]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

小智 0

您可以像这样重构代码。它将采用数字或字符串列表并构建 BST,但对于简单的二叉树,只if需要删除一个条件。

def add_child(self, val):
    if val == self.val:
        return
    
    elif val < self.val:
        if self.left:
            self.left.add_child(val)
        else:
            self.left = BinarySearchTree(val)
    else:
        if self.right:
            self.right.add_child(val)
        else:
            self.right = BinarySearchTree(val)

def build_tree(elements):
     root = BinarySearchTree(elements[0])
     for i in range(1, len(elements)):
         root.add_child(elements[i])

     return root

if __name__=="__main__":
     numbers = [15, 10, 8, 12, 20, 16, 25]        
     root = build_tree(numbers)
Run Code Online (Sandbox Code Playgroud)