二叉树的遍历

#include<iostream>
//#include<queue>//队列
using namespace std;
//二叉树的二叉链表存储表示
typedef struct BiNode
{    
 char data;      //结点数据域
 struct BiNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
//链栈的定义
typedef struct StackNode
{
 BiTNode data;
 struct StackNode *next;
}StackNode,*LinkStack;
void CreateBiTree(BiTree &T)
{ 
 //按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
 char ch;
 cin >> ch;
 if(ch=='#')  T=NULL;   //递归结束,建空树
 else{       
  T=new BiTNode;
  T->data=ch;     //生成根结点
  CreateBiTree(T->lchild); //递归创建左子树
  CreateBiTree(T->rchild); //递归创建右子树
 }        //else
} 
 //用算法5.1 中序遍历的递归算法       
void InOrderTraverse(BiTree T)
{  
 //中序遍历二叉树T的递归算法
 if(T){
  InOrderTraverse(T->lchild);
  cout << T->data;
  InOrderTraverse(T->rchild);
 }
}
void InitStack(LinkStack &S)
{
 //构造一个空栈S,栈顶指针置空
 S=NULL;
}
bool StackEmpty(LinkStack S)
{
 if(!S)
  return true;
 return false;
}
void Push(LinkStack &S,BiTree e)
{
 //在栈顶插入元素*e
 StackNode *p=new StackNode;
 p->data=*e;
 p->next=S;
 S=p;
}
void Pop(LinkStack &S,BiTree e)
{
 if(S!=NULL)//原书上写的是if(S==NULL)return ERROR;
 { 
  *e=S->data;
  StackNode *p=S;
  S=S->next;
  delete p;
 }
} 
  
void InOrderTraverse1(BiTree T)
{ 
  // 中序遍历二叉树T的非递归算法
 LinkStack S; BiTree p;
 BiTree q=new BiTNode;
 InitStack(S); p=T;
 while(p||!StackEmpty(S))
 {
  if(p) 
  {                
   Push(S,p);    //p非空根指针进栈,遍历左子树
   p=p->lchild;
  }       
  else
  {                 
   Pop(S,q);               //p为空根指针退栈,访问根结点,遍历右子树
   cout<<q->data;
   p=q->rchild; 
  }
 }        // while
}         // InOrderTraverse
//层次遍历二叉树
void LevelOrderTraverse(BiTree T)
{
 BiTree Queue[100],p=T;
 int  front=0 , rear=0 ;
 if  (p!=NULL) 
 {  
  Queue[rear++]=p;    /*   根结点入队  */
 
  //补充代码
  while(front != rear)
  {
   p = Queue[front++];
   cout<<p->data<<ends;
   if(p->lchild)
   Queue[rear++]=p->lchild; 
   if(p->rchild)
   Queue[rear++]=p->rchild; 
  }
  


 }
}
int main()  
{  
 //12##3##
 //ABDH##I##E#J##CF#K##G###//
    BiTree tree;
 cout<<"请输入建立二叉链表的先序序列:\n";
 CreateBiTree(tree);
 cout<<"中序遍历的结果为:"<<endl;
 cout<<"1.递归算法结果为:\n";
 InOrderTraverse(tree);
 cout<<endl;
 cout<<"2.非递归算法结果为:\n";
 InOrderTraverse1(tree);
 cout<<endl;
 cout<<"层次遍历结果为:"<<endl;
 LevelOrderTraverse(tree);
 cout<<endl;
    return 0;  
} 


posted @ 2018-05-24 23:02  底层码农  阅读(431)  评论(0编辑  收藏  举报