Python类实现树结构中self.left.PrintTree()与PrintTree逻辑解析
二叉搜索树
PrintTree方法逻辑解析 你看到的这段代码实现的是二叉搜索树的中序遍历,两个疑问可以结合遍历规则和代码执行流程逐一解释:
self.left.PrintTree()的含义
- 这是典型的递归调用写法:当当前节点存在左子节点时,优先执行左子节点的
PrintTree方法,意思是在处理当前节点的打印逻辑前,先把整个左子树的所有节点按照相同的遍历规则全部处理完成。 - 结合这个类的
insert逻辑就能理解这么写的原因:二叉搜索树的插入规则是「值小于当前节点的放左子树,值大于当前节点的放右子树」,也就是说任意节点的左子树所有节点值都比当前节点小,右子树所有节点值都比当前节点大。
为什么print(self.data)只放在左递归之后
- 这个打印位置不是随便放的,它刚好对应中序遍历「左子树 → 当前节点 → 右子树」的固定顺序,执行下来会天然得到二叉搜索树节点值的升序排列结果,也就是你运行得到的
3、6、12、14输出。 - 我们可以逐行拆解示例代码的执行流,逻辑会非常清晰:
- 从根节点12调用
PrintTree(),检测到左子节点6存在,暂时不打印12,先调用6.PrintTree() - 执行
6.PrintTree()时,检测到左子节点3存在,暂时不打印6,先调用3.PrintTree() - 执行
3.PrintTree()时,检测到左子节点为空,不需要递归左子树,直接执行print(3);再检测右子节点也为空,3节点的遍历完成,回到上一层6的执行流程 - 回到6的执行流程时,左子树已经全部处理完,执行
print(6);再检测右子节点为空,6节点遍历完成,回到上一层12的执行流程 - 回到12的执行流程时,左子树已经全部处理完,执行
print(12);再检测到右子节点14存在,调用14.PrintTree() - 执行
14.PrintTree()时,检测到左子节点为空,直接执行print(14);再检测右子节点为空,14节点遍历完成,整个打印流程结束
- 从根节点12调用
- 如果在左右分支都配置打印语句,同一个节点的值会被重复打印,遍历顺序也会被打乱,根本得不到有序的输出。你可以自行修改打印位置验证不同遍历效果:
- 打印放在左递归前:是前序遍历,输出顺序为
12、6、3、14 - 打印放在右递归后:是后序遍历,输出顺序为
3、6、14、12
- 打印放在左递归前:是前序遍历,输出顺序为
附测试用例完整代码
class Node: def __init__(self, data): self.left = None self.right = None self.data = data def insert(self, data) : if self.data : if data < self.data : if self.left is None : self.left = Node(data) else : self.left.insert(data) elif data > self.data: if self.right is None: self.right = Node(data) else : self.right.insert(data) else : self.data = data def PrintTree(self) : if self.left : self.left.PrintTree() print(self.data) if self.right : self.right.PrintTree() root = Node(12) root.insert(6) root.insert(14) root.insert(3) root.PrintTree()
运行输出:
3 6 12 14
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

