二叉树的递归遍历很好写,也很好理解。但因为是递归程序,不可避免地需要调用系统栈,耗时较长,这里我们来探究一下二叉树的非递归遍历的算法。这种方法需要使用栈这种数据结构,这里关于栈的一些操作函数可以看成伪代码吧,先给出线序、中序、后序遍历的代码即说明。

 

先序遍历:

 1 void PreOrderTraverse(BinTree b)
 2 {
 3     InitStack(S);///初始化创建栈
 4     BinTree p=b;///p为工作指针
 5     while(p||!isEmpty(s))
 6     {
 7         while(p)///到最左下的孩子
 8         {
 9             printf(" %c ",p->date);///先序先遍历结点
10             Push(S,p);///入栈
11             p=p->lchild;
12         }
13         if(!isEmpty(s))///在栈不为空的情况下,左孩子为空,弹出该结点,遍历右孩子
14         {
15             p=Pop(s);
16             p=p->rchild;
17         }
18     }
19 }

 再给出使用数组模拟的函数

 1 void Preorder_n(BiTree bt)  /*先序遍历的非递归算法*/
 2 {
 3     BiTree stack[MAX],p;
 4     int top=0,i;
 5     for(i=0; i<MAX; i++)
 6     {
 7         stack[i]=NULL; /*初始化栈*/
 8     }
 9     p=bt;
10     do
11     {
12         while(p)
13         {
14              printf("%c",p->data);
15              stack[top++]=p;
16              p=p->lchild;
17         }
18         if(top!=0)
19         {
20             p=stack[top-1];//去栈底
21             top--;//出栈
22             p=p->rchild;
23         }
24     }while(top!=0||p!=NULL);
25 }
View Code

相关文章: