小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前序(中左右)
迭代方法1
- 准备一个数组和一个栈,数组用于保存结果而栈用于模拟递归。
- 首先将根结点(4)入栈,然后出栈,出栈后将其值放置到用于存储结果的数组
- 然后将左右的子结点压入栈,因为栈是先入后出,所以先将其右子树入栈后在将左子树入栈
- 然后将左子结点出栈,出栈将其子添加到数组同时将其左子树和右子树入栈
- 迭代重复上面步骤知道栈空完成迭代,此时数组保存了迭代的结果
迭代方法2
- 首先将根结点压入栈,然后将当前结点(cur_Node)指针指向其左结点
- 重复上面步骤一路将所有左侧结点都压入栈,在入栈前将其值添加到结果数组
- 在遍历了所有左子结点,为 None 时就开始将对应右子结点压入栈
层级迭代
在 python 可以数组模拟队列和栈,这一点不得不说很方便。我们在遍历过程将每一层元素都放置到 level 数组,通过队列临时存储每一层的节点。其实层级遍历只看代码就比较直接,而且还有很多变体,衍生出其他题。
def level_order(self,cur_node,res):
q = []
if cur_node != None:
q.append(cur_node)
while len(q) > 0:
size = len(q)
level = []
for i in range(size):
cur_node = q.pop()
level.append(cur_node.val)
if cur_node.left !=None:
q.append(cur_node.left)
if cur_node.right !=None:
q.append(cur_node.right)
res.append(level)
例如下面代码就是变体得出问题
- 103. Binary Tree Zigzag Level Order Traversal
- 107. Binary Tree Level Order Traversal II
def zigzag_level_order(self,cur_node,res):
q = []
if cur_node != None:
q.append(cur_node)
while len(q) > 0:
size = len(q)
level = []
for i in range(size):
cur_node = q.pop()
print(len(res))
if (len(res) % 2 == 0):
level.append(cur_node.val)
else:
level.insert(0,cur_node.val)
if cur_node.left !=None:
q.append(cur_node.left)
if cur_node.right !=None:
q.append(cur_node.right)
res.append(level)
def level_order_btm(self,cur_node,res):
q = []
if cur_node != None:
q.append(cur_node)
while len(q) > 0:
size = len(q)
level = []
for i in range(size):
cur_node = q.pop()
level.append(cur_node.val)
if cur_node.left !=None:
q.append(cur_node.left)
if cur_node.right !=None:
q.append(cur_node.right)
res.insert(0,level)