python - 二叉搜索树插入功能无法向树中添加新节点
问题描述
我正在编写代码以在 Python 中实现二叉搜索树。我在编写函数时遇到了问题insert
,它应该在树中正确的顺序位置添加一个新节点。我用两种不同的方式编写了它:insertNode1
工作正常(正确地在树上执行插入),但insertNode2
没有正确执行插入。当我使用insertNode1
and对树执行 InOrderTraversalinsertNode2
时,结果表明“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)
解决方案
insertNode2
由于 line 没有按预期正确执行插入node = TreeNode(val)
,这对 . 进行了纯粹的本地分配node
。这个新对象永远不会设置为其父对象.left
或.right
属性,并且在函数返回时丢失。在此函数的任何运行中都不会修改根节点。
要么使用 already-working 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
这相当于:
推荐阅读
- bluetooth - 如何在两个设备之间创建蓝牙 L2CAP 连接?
- php - 从 XML 文件中读取属性
- vue.js - 如何在 vue-class-component 中访问 v-model
- arrays - 神经网络输出形状不匹配
- azure-active-directory - 自定义 Azure B2C 注册策略 - 业务逻辑 API 的客户端凭据授权流程
- c++ - 如何在 C++ 中重新声明已创建的对象值
- sql - 更新列并立即使用结果更新同一语句中的第二列
- php - 如何从 XML id 中获取价值 - PHP
- sql - SELECT 附近的输出参数语法不正确
- css - 淡入后按钮闪烁