二叉树的四种的非递归遍历算法

  1 #include <iostream>
  2 #include <stack>
  3 #include <queue>
  4 using namespace std;
  5 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 }
时间: 2024-10-20 08:12:03

二叉树的四种的非递归遍历算法的相关文章

二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)

1 typedef struct TreeNode *BinTree; 2 typedef BinTree Position; 3 struct TreeNode{ 4 ElementType Data; 5 BinTree Left; 6 BinTree Right; 7 }; 8 BinTree BT; 9 void InOrderTraversal(BinTree BT)//中序遍历非递归遍历算法(使用堆栈,用循环实现) 10 { 11 BinTree T=BT; 12 Stack S=C

先序遍历的非递归遍历算法

先序遍历的非递归遍历算法: 1 void InOrderTraversal(BinTree BT) 2 { 3 BinTree T=BT; 4 stack S=CreatStack(MaxSize)://创建并初始化堆栈S 5 while(T || !IsEmpty(S)){ 6 While(T){//一直向左并将沿途节点压入堆栈 7 printf("%5d",T->Data);//(访问)打印节点 8 Push(S,T); 9 T=T->left; 10 } 11 if(

二叉树,递归非递归遍历算法(全)

包含了所有的非递归和递归的算法: #include<iostream> #include<queue> #include<stack> using namespace std; //二叉树结点的描述 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode,*BiTree; //按先序遍历创建二叉树 //BiTree *CreateBiTree() //返回结

[算法]二叉树的非递归遍历算法

1.二叉树的非递归中序遍历算法 二叉树的中序遍历方法是:左中右,因此一开始会顺着根节点的左孩子一直往下(这点和先序遍历一样,这也是二者前面部分代码很相似的原因),到最后一个左孩子时尝试把它的右孩子塞进栈内,然后顺着它的的左孩子而下,直到不能访问为止.利用的栈FILO的特性,对每个节点都进行顺左孩子而下即可. 上代码: 1 void inOrder(TreeNode* root,vector<int>& inOrder) 2 { 3 stack<TreeNode*>st; 4

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

二叉树的非递归遍历--京东2015笔试回忆

题目回忆: C/C++研发试卷:偏重于数据结构的考察,编程题有2题+1题附加题: 1.输入整数n,求m,m>9,m中各个数位的乘积=n的最小整数;如n=36,m=49; 2.二叉树前序遍历的非递归实现(本文的总结) 3.求第n个数,这个序列满足(2^i)*(3^j)*(5^k),前7个为:2,3,4,5,6,8,10 .... 小题有基本的数据结构.程序运行结果.SQL题目. 4.删除表格用DROP命令,死锁产生的条件: 4.1互斥使用(资源独占) 一个资源每次只能给一个进程使用 4.2.不可强

二叉树的非递归遍历(转)

原文地址 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点. 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问. 1.递归实现 void pr

(转)二叉树的非递归遍历

转自: 二叉树的非递归遍历 http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都

二叉树的非递归遍历(转载)

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点. 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问. 1.递归实现 void preOrde