zoukankan      html  css  js  c++  java
  • 二叉树的四种的非递归遍历算法

      1 #include <iostream>
      2 #include <stack>
      3 #include <queue>
      4 using namespace std;
      5 typedef struct BinTree
      6 {
      7     int data;
      8     BinTree *lc;
      9     BinTree *rc;
     10 }BTNode,*BinTree;
     11 
     12 //中序遍历的非递归算法
     13 void InOrder(BinTree T)
     14 {
     15     stack<BinTree> s;
     16     BinTree P = T;
     17     while(p||!s.empty())//只要有一个满足即可,此时p不为空
     18     {
     19         if(p)
     20         {
     21             s.push(p);
     22             p = p->lc;
     23         }
     24         else
     25         {
     26             p = s.top();//访问栈顶
     27             s.pop();
     28             cout<<p->data<<endl;//访问
     29             p = p->rc;
     30         }
     31     }
     32 
     33 }
     34 
     35 //先序遍历的非递归算法
     36 void PreOrder(BinTree T)
     37 {
     38     stack<BinTree> s;
     39     BinTree p = T;
     40     while(p||!s.empty())
     41     {
     42         if(p)
     43         {
     44             cout<<p->data<<endl;//访问
     45             s.push(p);
     46             p = p->lc;
     47         }else
     48         {
     49             p = s.top();//访问栈顶
     50             s.pop();
     51             p = p->rc;
     52         }
     53     }
     54 }
     55 
     56 
     57 //后序遍历的非递归算法
     58 void PostOrder(BinTree T)
     59 {
     60     stack<BinTree> s;
     61     BinTree p = T,r = NULL;
     62     while(p||!s.empty())
     63     {
     64         if(p)
     65         {    //从根节点向左边走
     66             s.push(p);
     67             p = p->lc;
     68         }
     69         else
     70         {    //左边走不通向右走
     71             p = s.top();
     72             if(p->rc&&p->rc!=r)//如果右子树存在,且未被访问过
     73             {
     74                 p = p->rc;
     75                 s.push(p);
     76                 p = p->lc;
     77             }else
     78             {
     79                 p=s.top();
     80                 s.pop();
     81                 cout<<p->data<<endl;
     82                 r=p;            //记录最近访问的节点
     83                 p=NULL;            //节点访问完之后,重置p指针,目的是为了防止再次将左孩子压栈
     84             }
     85         }
     86     }
     87 }
     88 
     89 //层次遍历的非递归算法
     90 
     91 void LevelOrder(BinTree T)
     92 {
     93     if(T==NULL)
     94         return;
     95     queue<BinTree> q;
     96     q.push(T);                //根节点压栈
     97     BinTree p;
     98     while(!q.empty())
     99     {
    100         p = q.front();        //获取队头
    101         q.pop();
    102         cout<<p->data<<endl;//访问
    103         if(p->lc)
    104             q.push(p->lc);
    105         if(p->rc)
    106             q.push(p->rc);
    107         
    108     }
    109 }
  • 相关阅读:
    Axis2发布Webservice进行身份校验
    Spring集成Axis2
    分布式事务解决方案之TCC
    Lua 数据类型
    Lua 基本语法(1)
    Axis发布Webservice服务
    Linux中NFS服务器搭建
    SpringBoot多环境切换
    springboot中spring.profiles.include的妙用
    oracle树形语句
  • 原文地址:https://www.cnblogs.com/houjun/p/4859759.html
Copyright © 2011-2022 走看看