二叉树的遍历
Node
的数据结构:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
前序遍历-非递归:
def preorder_loop(self,root:TreeNode): # 前序遍历 top->left->right
p = root
stack = []
res = []
while(stack or p):
while(p): # 指向一个结点
res.append(p.val) # 直接访问
stack.append(p) # 自己入栈(为了后续找到右孩子)
p = p.left # 指向左孩子
p = stack.pop() # 出栈
p = p.right # 指向右孩子
return res
中序遍历-非递归:
def inorder_loop(self,root:TreeNode): # 中序遍历 left->top->right
p = root
stack = []
res = []
while(stack or p):
while(p): # 指向一个结点
stack.append(p) # 自己入栈
p = p.left # 指向左孩子
p = stack.pop() # 出栈
res.append(p.val) # 访问
p = p.right # 指向右孩子
return res
后序遍历-非递归:
def postorder_loop(self,root:TreeNode): # 后序遍历 left->right->top
p = root
stack = []
res = []
last = None # 标记上一个被打印的节点
while(stack or p):
while(p):
stack.append(p) # 自己入栈
p = p.left # 指向左孩子
p = stack.pop() # 出栈
if p.right == last or p.right is None: # 只有右孩子为None或者右孩子已访问才访问自己
res.append(p.val)
last = p
p = None # 防止p再次入栈造成死循环 或者重复访问
else:
stack.append(p) # 再次把自己入栈
p = p.right # 指向右孩子
return res
层序遍历-非递归:
def levelorder_loop(self,root:TreeNode):
p = root
res = []
queue = []
if p is not None : queue.append(p) # 不为空则入队列
while(queue): # 队列不空则循环继续
p = queue.pop(0) # 队首出队
res.append(p.val) # visit
if p.left is not None : queue.append(p.left)
if p.right is not None : queue.append(p.right)
return res
前序遍历-递归:
def preorder_recur(self,root:TreeNode):
if root is None : return []
p = root
res = []
res.append(p.val)
res += self.preorder_recur(p.left)
res += self.preorder_recur(p.right)
return res
中序遍历-递归:
def inorder_recur(self,root:TreeNode):
if root is None : return []
p = root
res = []
res += self.inorder_recur(p.left)
res.append(p.val)
res += self.inorder_recur(p.right)
return res
后序遍历-递归:
def postorder_recur(self,root:TreeNode):
if root is None : return []
p = root
res = []
res += self.postorder_recur(p.left)
res += self.postorder_recur(p.right)
res.append(p.val)
return res
测试用二叉树示意图:
5
/ \
3 6
/ \
2 4
/
1
测试代码:
n5 = TreeNode(5)
n3 = TreeNode(3)
n6 = TreeNode(6)
n2 = TreeNode(2)
n4 = TreeNode(4)
n1 = TreeNode(1)
n5.left = n3
n5.right = n6
n3.left = n2
n3.right = n4
n2.left = n1
preorder_loop = solution.preorder_loop(n5)
preorder_recur = solution.preorder_recur(n5)
inorder_loop = solution.inorder_loop(n5)
inorder_recur = solution.inorder_recur(n5)
postorder_loop = solution.postorder_loop(n5)
postorder_recur = solution.postorder_recur(n5)
levelorder_loop = solution.levelorder_loop(n5)
print("前序遍历-非递归:",preorder_loop)
print("前序遍历-递归 :",preorder_recur)
print("中序遍历-非递归:",inorder_loop)
print("中序遍历-递归 :",inorder_recur)
print("后序遍历-非递归:",postorder_loop)
print("后序遍历-递归 :",postorder_recur)
print("层序遍历-非递归:",levelorder_loop)
输出:
前序遍历-非递归: [5, 3, 2, 1, 4, 6]
前序遍历-递归 : [5, 3, 2, 1, 4, 6]
中序遍历-非递归: [1, 2, 3, 4, 5, 6]
中序遍历-递归 : [1, 2, 3, 4, 5, 6]
后序遍历-非递归: [1, 2, 4, 3, 6, 5]
后序遍历-递归 : [1, 2, 4, 3, 6, 5]
层序遍历-非递归: [5, 3, 6, 2, 4, 1]