二叉树的遍历实现
二叉树是每个结点最多有两个子树的树结构
遍历的方法
- 前序遍历,根节点->左子树->右子树
- 中序遍历,左子树->根节点->右子树
- 后序遍历,左子树->右子树->根节点
- 层次遍历,按照层数,从根节点依次往下找
- 前序,后序,中序都是深度优先遍历的方式
- 层次遍历是广度优先的遍历方式
使用递归的方式比采用迭代的方式慢
递归的方式
- 前序遍历: 保存当前节点的值,然后递归调用左节点和右节点
- 后序遍历: 先递归调用左节点和右节点,然后再保存当前节点的值
- 中序遍历: 先递归调用左节点,保存当前节点值,再递归调用右节点
非递归的方式
前序遍历: 根据前序遍历的顺序,优先访问根结点,然后在访问左子树和右子树。所以,对于任意结点node,第一部分即直接访问之,之后在判断左子树是否为空,不为空时即重复上面的步骤,直到其为空。若为空,则需要访问右子树。注意,在访问过左孩子之后,需要反过来访问其右孩子,所以,需要栈这种数据结构的支持。对于任意一个结点node,具体步骤如下:
- 访问之,并把结点node入栈,当前结点置为左孩子;
- 判断结点node是否为空,若为空,则取出栈顶结点并出栈,将右孩子置为当前结点;否则重复上面的步骤直到当前结点为空或者栈为空(可以发现栈中的结点就是为了访问右孩子才存储的)
后序遍历: 使用两个栈来存储左右节点,将每个节点都保存到其中一个栈,然后将该节点的左右节点保存到这个栈,删除在这个栈的节点,保存该节点到第二个栈;然后遍历第二个栈里面的数据,这样才能保证左右节点的值先于根节点保存
中序遍历: 和前序遍历有点类似,把每个节点的左子树存入栈,删除栈中的该节点,保存值。直到左子树节点为空,把右子树作为当前节点。
- 层次遍历: 使用消息队列,把每个节点都存入队列中,再出队列的时候,依次访问左右子树的根节点值,如果左右子树不为空的情况下,都存入队列
1 | #!/usr/bin/env python |