zoukankan      html  css  js  c++  java
  • 二叉树后序遍历(非递归)


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

     

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

       1 // main.cpp

      2  #include <iostream>
      3  using namespace 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 }

     运行结果如图:

  • 相关阅读:
    rsync命令 SCP命令
    Linux 性能分析 工具命令
    ntp时间服务器 时间同步
    Linux 邮件服务
    linux 手工释放内存 高内存 内存回收 方法思路
    LVM 逻辑卷 (logica volume manager)
    Linux 磁盘原理与管理 (分区 挂载)
    linux中查看nginx、apache、php、mysql配置文件路径
    shell脚本 监控ps 不存在则重启
    Shell脚本 一键重启
  • 原文地址:https://www.cnblogs.com/hicjiajia/p/1810055.html
Copyright © 2011-2022 走看看