二叉树遍历
二叉树定义
二叉树的父节点最多有2个子节点,如果二叉树的所有父节点没有节点或者有2个节点,那么叫完全二叉树
二叉树的遍历方式
二叉树有4中遍历方式: 前序遍历, 中序, 后序, 以及层序
前三种可以对比着看,区别在于父节点先被访问的顺序,这里的先后都是相对于同一个树而言。 这里的访问意思是访问其值, 例如打印节点的数据:
- 前序遍历, 先父节点,再左子节点,最后是右子节点
- 中序遍历, 先左子节点, 再父节点, 最后是右子节点
- 中序遍历, 先左子节点, 再右子节点 ,最后父节点
可见,都是先左子节点后右子节点
而层序遍历是从上往下,广度优先
效果
若有以下二叉树,则遍历结果
graph BT A[1] --> B[0] C[2] --> B D[3] --> A E[4] --> A F[5] --> C G[6] --> C H[7] --> D I[8] --> D J[9] --> E
层序: 0 1 2 3 4 5 6 7 8 9
先序: 0 1 3 7 8 4 9 2 5 6
中序: 7 3 8 1 9 4 0 5 2 6
后序: 7 8 3 9 4 1 5 6 2 0
注意下划线,即036组成的一个树, 可以证实上面的总结
代码实现
实现前三种遍历都有2种方式, 递归和使用stack
节点数据结构
1 | def Node: |
递归实现
前序遍历
1 | def front_recursion(root: Node): |
中序遍历
1 | def Middle_recursion(root: Node): |
后序遍历
1 | def Middle_recursion(root: Node): |
stack实现
前序遍历
1 | def Front_stack(root: Node): |
中序遍历
1 | def Middle_stack(root: Node): |
后序的stack比较复杂
还有一个比较简单的先序stack
1 | def Front_stack(root: Node): |
层序遍历,是广度优先的一种方式,所以使用到queue
1 | def Layer_queue(root: Node): |
后序栈遍历
后序遍历的顺序是先左子后右子,最后才是父节点
1 | ''' |