二叉树中序遍历非递归算法详解

来源:互联网 发布:linux vi修改ip地址 编辑:程序博客网 时间:2024/06/05 16:36

二叉树中序遍历非递归详解

1.      首先给出一颗二叉树,如下图所示:


图1 一颗简单的二叉树

根据二叉树的中序遍历的特性,该二叉树中序遍历顺序为:DBGEACHFI;

2.      一般遍历一颗二叉树,先序中序或者后序,大家最喜欢也最熟悉的方法是采用递归的形式来描述,但是在面试或者笔试的过程中,面试官一般都会要求采用非递归形式的二叉树遍历过程。我们先给出二叉树的递归形式(以中遍历为例子),然后给出二叉树的非递归形式。

Void inOrder(BiTree root){

If(root!=NULL){

   inOrder(root->left);

   cout<<root->data<<”\t”;

   inOrder(root->right);

}

}

3.      二叉树中序非递归写法如下,先给出代码,后面会具体给出代码分析:

Void inOrder(BiTree root){

BiTree stack[MaxSize],p=root;//建立一个顺序栈,设置一个临时指针,并将指针p指向根节点;

Int top=1;//设置顺序栈的初始大小为1;

While(top>0||p!=NULL)//循环条件,栈大小不为空或者p非空;

{

   If(p!=NULL){//如果遇到非空二叉树,入栈,并沿着当前节点的左链遍历当前节点的左子树;

   {

      Stack[++top]=p;

      P=p->left;

}

else{

//如果遇到空的二叉树,就将当前指针出栈,并打印出出栈指针的值,并沿着当前节点的右链遍历当前节点的右子树;

p=stack[top--];

cout<<p->data<<”\t”;

p=p->right;

}

//循环终止条件时当栈的大小为0或者当前指针p为空!;   

}

}

}

4.      对于上面的图,我们可以对它进行追踪其非递归的执行过程:

 

 

 

原创粉丝点击