一步两步学算法之树的遍历 非递归实现

递归的程序其实我觉得可读性较高  但是执行效率低下

为了做一道PAT的题 去理解了下非递归实现树的遍历

用一个栈来实现 

先序遍历 

先访问节点 再把节点push进栈 再访问 再push 直到next=NULL 

然后pop出一个节点 也就是弹出一个节点 访问它的右边 再弹出 在访问 

 

中序遍历

把左边节点全部push进栈 然后弹出 访问中间 再访问右边  再弹出 一直循环

 

后序遍历

比较难理解  要入两次栈才能访问 先左边全部入栈  栈顶是左边的元素 此书不能访问 因为右边还没入栈 

下面给出先序和后序的代码  后序的代码 记得调试下看看  不然很难理解

给出一张图片便于理解  来自c语言中文网

技术分享

void  NRpreOrder(BiTree bt)
{
    BiTree stack[MXSNODE],p;
    int top;
    if(bt==NULL)
        return;
    top=0;
    p=bt;
    while(!(p==NULL &&top==0))
    {
        while(p!=NULL)
        {
            visit(p->data); //访问节点数据
            if(top<MAXNODE-1)
            {
                stack[top]=p;    //访问后的节点进栈 
                top++;            
            } 
            else
            {
                printf("栈溢出");
                return; 
            }
            p=p->left;            //指向下一个 
        }
        if(top<=0)
            return;
        else{
            top--;
            p=stack[top];        //弹出节点 
            p=p->right;            //指向右边 
        }
    }
}

 

 

 

 1 #include "stdio.h"
 2 #define MXSNODE 10
 3 typedef struct Bitree
 4 {
 5     int data;
 6     struct Bitree *left;
 7     struct Bitree *right;
 8 }BiTree;
 9 
10 typedef struct
11 {
12     BiTree *link;
13     int flag;
14 }stacktype;
15 
16 void  NRpreOrder(BiTree *bt)
17 {
18     stacktype stack[MXSNODE];
19     BiTree *p;
20     int top,sign;
21     if(bt==NULL)
22         return;
23     top=-1;
24     p=bt;
25     while(!(p==NULL &&top==-1))
26     {
27         if(p!=NULL)
28         {
29             top++;
30             stack[top].link=p;
31             stack[top].flag=1;
32             p=p->left;
33         }
34         else
35         {
36             p=stack[top].link;
37             sign=stack[top].flag;
38             top--;
39         
40             if(sign==1)
41             {
42                 top++;
43                 stack[top].link=p;
44                 stack[top].flag=2;
45                 p=p->right;
46             }
47             else{
48                 printf("%d",p->data);
49             }
50         }
51     }
52 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。