二叉树的前序、中序、后续、层序遍历原理及Python代码实现
正好前几天被一个学弟问了一下数据结构里的二叉树的问题,这毕竟也是老黄历了,翻了翻之前的博客,WordPress的数据库一团糟,当时写的好几篇文章全是乱码,明明密码是对的结果硬是提示错误。还是想办法重新写一个吧,之前用的C语言,也已经忘得差不多了,这次用Python重新写一写,顺带测试一下新的水印功能((#.#))
1. 引言
二叉树遍历:是指从根节点出发,按照某种次序依次访问二叉树中的所有节点,使得每个节点被访问一次且仅被访问一次
二叉树的遍历方式分为:前序遍历、中序遍历、后序遍历、层序遍历
![image-20210114031110150](https://cdn.jsdelivr.net/gh/szxczyc/pic-speed@master/image-20210114031110150.png)
2. 原理及代码实现
例图都是我手画的,由于涉及到后续代码,我给每个节点加上了a[i]的下标方便理解
2.1 前序遍历
2.1.1前序遍历原理
![image-20210114033647532](https://cdn.jsdelivr.net/gh/szxczyc/pic-speed@master/image-20210114033647532.png)
前序遍历的公式为:根节点 → 左子树 → 右子树
那么,结果就为:A→B→D→G→H→C→E→I→F
啰嗦一点:从A到B再到D,D有两个子树,从左到右遍历GH,然后转向A的另一个子树C,然后遍历Ed左子树,然而左子树为空,继而遍历I,最后回过头遍历Cd另一个子树F,遍历结束。
2.1.2 前序遍历代码实现
class TreeNode:
def __init__(self,val):
self.val = val
self.left = None
self.right = None
self.parent = None
# 递归
qianxu = []
def PreOrder(root):
if not root:
return None
qianxu.append(root.val)
PreOrder(root.left)
PreOrder(root.right)
# 非递归
def Pre_Order(root):
data = []
stack = []
cur = root
while cur or stack:
while cur: # 若当前节点不为空
data.append(cur.val) # 得到当前节点值
stack.append(cur) # 压入栈中
cur = cur.left # 去往左子树
top = stack.pop() # 来到这里,说明当前节点为空,也就是当前节点的父节点无左子树,取出栈顶元素也就是当前节点的父节点
cur = top.right # 往右子树的方向,若右子树为空则看栈是不是空,若栈不为空,再取出栈顶节点,访问其右子树
return data
if __name__ == '__main__':
a1 = TreeNode('A')
a2 = TreeNode('B')
a3 = TreeNode('C')
a4 = TreeNode('D')
a5 = TreeNode('E')
a6 = TreeNode('F')
a7 = TreeNode('G')
a8 = TreeNode('H')
a9 = TreeNode('I')
a1.left = a2
a1.right = a3
a2.left