栈模拟递归 遍历二叉树的正确写法
对于二叉树的生成,遍历,应该是树这个数据结构需要的基本功,只有真的理解了树的生成,遍历,递归的过程,才能更好的去做二叉树的翻转等题目。
二叉树的生成
1.通过层次遍历来顺序插入
2.利用左右节点进行插入,自由度最高,可以形成任意形状的树
# 节点结构和树结构:
class Node():
def __init__(self, val: int):
self.val = val
self.lchild = None
self.rchild = None
class Tree():
def __init__(self, root: Node = None):
self.root = root
self.q = [] # 插入时顺序插入的话,需要在树的属性中保存一个当前节点状态的队列,\
# 以便获取当前插入节点的父节点
def insert(self, node: Node):
if not self.root:
self.root = node
self.q.append(self.root)
else:
parNode = self.q[0]
if not parNode.lchild:
parNode.lchild = node
self.q.append(node)
elif not parNode.rchild:
parNode.rchild = node
self.q.append(node)
self.q.pop(0)
这个写法的好处是,完全支持两种初始化的方式:
生成如图所示的节点:
# method1 层次顺序插入
tree = Tree()
for i in range(6):
node = Node(i)
tree.insert(node)
# method2 直接构建树,支持随意插入
root = Node(0)
_t