前言
数据结构学过好久了,刷leetcode做到二叉树的题,干脆系统的复习一下二叉树的相关知识。二叉树的遍历是基本操作,其中非递归写法稍微难一些。其相对递归地有点是效率高,空间时间均更高效,特别是二叉树比较深的情况下。
前序遍历
前序遍历就是从栈里取出节点,然后右子节点入栈,左子节点入栈,结束的条件是栈中没有节点。
中序遍历
算法中对每一个节点先一直左子树的子树这样进栈,结束后取出当前节点,右子树进栈。这样循环。
class Traversal:
def midtraversal(self, root):
stack = []
current = root
while stack or current: #我认为这个判断条件很重要
if current:
stack.append(current)
current = current.left
else:
current = stack.pop()
print(current.val)
current = current.right
后序遍历
本段代码是看的网上的,我觉得挺好。使用了两个stack,其思想是后序遍历是左右根,栈具有后进先出,先进后出的特点,那么第一个stack栈进栈的顺序是中(进后立即出)左右,出栈顺序是中右左,用第二个stack2栈存储stack出栈的节点,那么stack2进栈的顺序就是中右左,则stack2出栈的顺序是左右中。
class Traversal:
def backtraversal(self, node):
stack = [node]
stack2 = []
while len(stack) > 0:
node = stack.pop()
stack2.append(node)
if node.left is not None:
stack.append(node.left)
if node.right is not None:
stack.append(node.right)
while len(stack2) > 0:
print(stack2.pop().val)