二进制搜索树插入功能无法向树中添加新节点

时间:2019-06-24 17:04:25

标签: python insert binary-search-tree

我正在编写代码以在Python中实现二进制搜索树。我在编写insert函数时遇到问题,该函数应在树中正确的顺序位置添加一个新节点。我用两种不同的方式编写它:insertNode1可以正常工作(正确地在树上执行插入操作),但是insertNode2不能正确执行插入操作。当我使用insertNode1insertNode2对树进行InOrderTraversal时,事实证明,“ insertNode1”产生完整的树,而“ insertNode2”只产生根。

为什么insertNode1成功而insertNode2失败,这两个功能之间的有意义区别是什么?

这是我的代码:

def insert(self,val):
    if not self.root:
      self.root = TreeNode(val)
    else:
      self.insertNode2(self.root, val)

  def insertNode1(self,node, val):
    if val < node.val:
      if not node.left:
        node.left = TreeNode(val)
      else:
        self.insertNode1(node.left,val)
    else:
      if not node.right:
        node.right = TreeNode(val)
      else:
        self.insertNode1(node.right, val)

  def insertNode2(self, node, val):
    if not node:
      node = TreeNode(val)
    else:
      if node.val > val:
        self.insertNode2(node.left, val)
      else:
        self.insertNode2(node.right, val)

1 个答案:

答案 0 :(得分:0)

insertNode2由于行node = TreeNode(val)未能正确执行插入操作,因此仅对node进行了本地分配。此新对象永远不会设置为其父.left.right属性,并且在函数返回时会丢失。根节点将不会在此函数的任何运行中被修改。

要么使用已经正常工作的insertNode1,要么向return node添加insertNode2语句,然后在父函数调用范围中为新子项分配一个值。

以下是演示如何执行此操作的代码段:

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

class BinarySearchTree:
    @staticmethod
    def p(root, depth=0):
        if root:
            print(" " * depth + str(root.val))
            BinarySearchTree.p(root.left, depth + 2)
            BinarySearchTree.p(root.right, depth + 2)

    @staticmethod
    def insert(node, val):
        if not node:
            return TreeNode(val)    
        elif node.val > val:
            node.left = BinarySearchTree.insert(node.left, val)
        else:
            node.right = BinarySearchTree.insert(node.right, val)

        return node

if __name__ == "__main__":
    root = TreeNode(5)

    for n in [2, 1, 3, 7, 9, 6]:
        BinarySearchTree.insert(root, n)

    BinarySearchTree.p(root)

输出:

5
  2
    1
    3
  7
    6
    9

等于:

tree