非递归实现二叉树的前序、中序、后序遍历

来源:互联网 发布:mac pd好还是vm好 编辑:程序博客网 时间:2024/06/05 04:04

二叉树

二叉树

1 非递归前序遍历二叉树

1.1 递归前序遍历二叉树


  • 按照教科书上的做法,前序遍历过程如下:先访问根节点,再访问左节点,再访问右节点
  • 另一种访问方式为:按照图中红线的轨迹,第一次遇到的节点即为前序遍历的过程
  • 按照以上两种方法中的任意一种遍历都可以得到如下结果,前序遍历结果

A->B->D->G->H->C->E->I->F

1.2 非递归实现前序遍历

用栈可以实现二叉树的非递归前序遍历。栈是一种先进先出的数据结构,示意图如下:
这里写图片描述
用栈实现的二叉树前序遍历的过程如下:

  • 1)将根节点加入栈
  • 2)从栈中弹出一个节点,将该节点的右节点和左节点分别压入栈内
  • 3)重复步骤2直到栈为空,弹出节点的顺序即为前序遍历的顺序
    下图即为出栈入栈整个过程:
    前序遍历入栈出栈过程

2 非递归中序遍历二叉树

2.1 递归中序遍历二叉树


  • 按照教科书上的做法,中序遍历过程如下:先访问左子树,再访问根节点,再访问右节点
  • 另一种访问方式为:按照图中红线的轨迹,第二次遇到的节点即为前序遍历的过程
  • 按照以上两种方法中的任意一种遍历都可以得到如下结果,前序遍历结果

G->D->H->B->A->I->E->C->F

2.2 非递归实现前序遍历

依然用栈可以实现二叉树的非递归中序遍历。用栈实现的二叉树前序遍历的过程如下:
- 1)将树种所有的左子树全部压入栈内
- 2)从栈中弹出一个节点,如果该节点有右节点,则将以右节点为根节点的子树种所有的左节点压入栈内,如果有的节点没有左子树,只有右子树,则继续将节点的右子树中国的左节点加入到栈中
- 3)重复步骤2直到栈为空,弹出节点的顺序即为前序遍历的顺序

下图即为出栈入栈整个过程:
中序遍历入栈出栈过程

0 0