二叉树遍历算法的改进
二叉树的深度优先遍历算法都是用递归函数实现的,这是很低效的,原因在于系统帮你调用了一个栈并做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可以用非常简洁的代码实现。二叉树深度优先遍历算法的非递归实现用用户定义的栈来代替系统栈,也就是用非递归的方式来实现遍历算法,可以得到不小的效率提升。
二叉树深度优先遍历算法的非递归实现
(1)先序遍历非递归算法
要写出其遍历的非递归算法,其主要任务是用自己定义的栈来代替系统栈的功能。
以图1所示的二叉树为例,过程为图二所示
初态栈空
- 结点1入栈。
- 出栈,输出栈顶结点1,并将1的左、右孩子结点(2和4)入栈;右孩子先入栈,左孩子后入栈,因为对左孩子的访问要先于右孩子,后入栈的会先出栈访问。
- 出栈,输出栈顶结点2,并将2的左、右孩子结点(3和5)入栈。
- 出栈,输出栈顶结点3,3为叶子结点,无孩子,本步无结点入栈。
- 出栈,输出栈顶结点5。
出栈,输出栈顶结点4,此时栈空,进入终态。
遍历序列为1,2,3,5,4。
代码如下
void preorderNonrecursion(BTNode *bt)
{
if(bt != NULL)
{
BTNode *Stack[maxSize]; //定义一个栈
int top = -1; //初始化栈
BTNode *p;
Stack[++top] = bt; //根结点入栈
while(top != -1) //栈空循环结束
{
p = Stack[top--]