二叉树后序遍历(非递归)

二叉树的递归遍历算法就不用说了;在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着书上错误的代码绕了好半天,几预抓狂。好在最终摸索出来了,不禁感叹很多出书人的水平真是......   这里将直接可以在编译器里调试的代码贴出来(在DEV-C++编译器中编译通过)

这里我们约定:空的节点用空格表示,按照前序遍历来创建树!

  1// main.cpp




  2 #include<iostream>
  3 usingnamespace std;
  4 typedef struct node {
  5         char data;
  6         struct node *lchild;
  7         struct node *rchild;
  8         }BiNode,*BiTree;
  9 typedef struct node1{
10         BiTree data[30];    //默认30个元素 ,这里需要一个辅助堆栈!!!
11         int top;
12         }Stack;
13         
14 void createTree(BiTree&T)   //先序递归创建树,这里注意参数的类型,T的类型是 "*&" ,如果是 "**" 代码稍加改动就OK...
15 {
16      char ch;
17      cin.get(ch).get();     //过滤输入流中每次回车产生的回车符
18      if (ch=='') T=NULL;   //这里首先判断是不是空格,如果是,则为该节点赋NULL
19      else{
20             T=(BiTree)malloc(sizeof(BiNode));
21             T->data=ch;
22             createTree(T->lchild);
23             createTree(T->rchild);
24           }
25 }
26 void initstack(Stack*&st)
27 {
28      st=(Stack*)malloc(sizeof(Stack));
29      st->top=-1;
30 }
31 bool isempty(Stack*st)
32 {
33     return st->top==-1;
34 }
35 bool isfull(Stack*st)
36 {
37     return st->top==19;
38 }
39 void push(Stack*st,BiTree T)
40 {
41      if (!isfull(st))
42      st->data[++st->top]=T;    //栈顶指针始终指向堆栈最上面可用的一个元素,因此入栈时候,先要将指针加1,然后再执行入栈操作!
43      else cout<<"已满"<<endl;
44 }
45 BiTree pop(Stack*st)
46 {
47      if (!isempty(st))return st->data[st->top--];
48 }
49 BiTree gettop(Stack*st)
50 {
51        if (!isempty(st))return st->data[st->top]; //出栈时,先取出栈顶指针指向的元素,然后再将指针减1,使其指向栈中下一个可用元素!
52 }
53 void preOrderNoRe(BiTree T)         // 前序遍历
54 {
55    Stack *st;
56    initstack(st);
57    BiTree p;
58    p=T;
59      while (p!=NULL||!isempty(st))
60      {
61           while (p!=NULL)
62            {
63                  cout<<p->data<<" ";
64                  push(st,p);
65                  p=p->lchild;
66            }
67           if (!isempty(st))
68            {
69                        p=pop(st);
70                        p=p->rchild;
71            }
72           
73      }
74 }
75 void inOrderNoRe(BiTree T)      //中序遍历
76 {
77    Stack *st;
78    initstack(st);
79    BiTree p;
80    p=T;
81      while (p!=NULL||!isempty(st))
82      {
83           while (p!=NULL)
84            {
85                  push(st,p);
86                  p=p->lchild;
87            }
88           if (!isempty(st))
89            {
90                        p=pop(st);
91                        cout<<p->data<<" ";
92                        p=p->rchild;
93            }
94           
95      }
96 }
97 void postOrderNoRe(BiTree T)        //后序遍历
98 {
99      BiTree p;
100      Stack*st;
101      initstack(st);
102      p=T;
103      int Tag[20];     //栈,用于标识从左(0)或右(1)返回
104      while (p!=NULL|| !isempty(st))
105      {
106           while (p!=NULL)
107            {
108                  push(st,p);
109                  Tag[st->top]=0;
110                  p=p->lchild;
111            }
112           while (!isempty(st)&&Tag[st->top]==1)
113            {
114                  p=pop(st);
115                  cout<<p->data<<" ";
116            }
117           if (!isempty(st))
118            {
119                             Tag[st->top]=1;  //设置标记右子树已经访问 
120                             p=gettop(st);
121                             p=p->rchild;
122            }
123           else break;
124      }
125 }
126 int main()
127 {
128     cout<<"Enter char one by one                      hicjiajia"<<endl;
129     BiNode*T;
130     createTree(T);
131     cout<<endl;
132     
133     cout<<"preOrderNoRe: ";preOrderNoRe(T);cout<<endl;
134     cout<<"inOrderNoRe:  ";inOrderNoRe(T);cout<<endl;
135     cout<<"postOrderNoRe:";postOrderNoRe(T);cout<<endl;
136     system("pause");
137     return 0;
138 }


  

运行结果如图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值