【问题标题】:Insert a new value in a tree python在树python中插入一个新值
【发布时间】:2020-11-24 08:24:42
【问题描述】:

我有一棵像这样的树:

tree = [[[None,1,None],2,[None,3,None]],4,[None,6,[None,7,None]]]

数字代表每个节点的根,none代表没有值的子节点。

比如主根是4,[[None,1,None],2,[None,3,None]]是左边的子树,这个[None,6,[None,7,无]]是他右边的子树。左边子树上的主根是 2 等等……

我的问题是我想在这棵树中插入一个值。

例如我想加值5,这就是我想要的:

tree = [[[None, 1, None], 2, [None, 3, None]], 4, [[None, 5, None], 6, [None, 7, None]]]

我的函数有两个参数,树和整数相加,我需要使用递归函数,例如这是我开始的:

def insert(tree,int):
    cur = tree
    prev = None
    while cur != None:
        prev = cur
        if int < cur[1]:
            cur = cur[0]
        else :
            cur = cur[2]

提前致谢

【问题讨论】:

  • 你的树是二叉搜索树吗?
  • int 不推荐作为变量名。
  • @Maaddy 这不是二叉树,因为一个节点可以有两个以上的孩子
  • Yh 它是一棵二叉树 :)
  • 啊我明白了!我的坏

标签: python list tree insert binary-search-tree


【解决方案1】:

既然你提到了递归,这里有一个使用递归的解决方案:

def insert_node(root, node):
    if root == [None]:  #corner case of an empty tree
        root.append(node)
        root.append(None)   #now root will be : [None, node, None]
        return
    if node <= root[1]:  #we need to go left
        if root[0] == None:
            root[0] = [None, node, None]
            return
        else:
            insert_node(root[0], node)
    else:               #we need to go right
        if root[2] == None:
            root[2] = [None, node, None]
            return
        else:
            insert_node(root[2], node)

测试解决方案:

tree = [None]   #starting with an empty tree
insert_node(tree, 4)
insert_node(tree, 2)
insert_node(tree, 1)
insert_node(tree, 3)
insert_node(tree, 6)
insert_node(tree, 7)
print(tree)

该函数递归遍历树,直到到达插入节点的正确位置。由于它是二叉搜索树,我们必须保证一个节点左边的任何孩子都应该小于该节点,而右边的任何孩子都应该大于该节点的条件。这就是为什么我们根据新节点与遍历当前根的比较来左/右。

【讨论】:

    【解决方案2】:

    这可以通过遍历树来找到目标节点并将其元素替换为所需的值来完成。

    # Do an in-order traversal recursively
    def in_order(tree):
        if tree is None:
            return
        for element in in_order(tree[0]):
            yield element
        yield tree
        for element in in_order((tree[2])):
            yield element
    
    # helper method to create a new node
    def new_node(val):
        return [None, val, None]
    
    if __name__ == '__main__':
        tree = [[[None, 1, None], 2, [None, 3, None]], 4, [None, 6, [None, 7, None]]]
        print(tree)
        # Search for the target node with the value 6 and create a new node as its left child 
        for element in in_order(tree):
            if element[1] == 6:
                element[0] = new_node(5)
        print(tree)
    

    由于树遍历是访问树中所有节点的通用方法,因此可以对其进行修改以查找其他节点。 例如:

    # Finding leaf nodes
    for element in in_order(tree):
        if element[0] is None and element[2] is None:
            # Do something
            pass
    

    前序和后序遍历同样适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      相关资源
      最近更新 更多