数据结构实验(严蔚敏版)二叉树的建立与遍历

#include<iostream>
using namespace std;
typedef char TElemType;
typedef int Status;
typedef struct BitNode
{
	TElemType data;
	struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
Status CreatBitTree(BitTree &T)
	//先序建树
{
	char ch;
	cin>>ch;
	if(ch=='*')
		T=NULL;
	else
	{
		T=new BitNode[sizeof(BitNode)];
		T->data=ch;
		CreatBitTree(T->lchild);
		CreatBitTree(T->rchild);
	}
	return 1;
}
Status DiguiPre(BitTree &T)
	//递归前序
{
	if(T)
	{
		cout<<T->data<<" ";
		DiguiPre(T->lchild);
		DiguiPre(T->rchild);
	}
	return 1;
}
Status DiguiIn(BitTree &T)
	//递归中序
{
	if(T)
	{
		DiguiIn(T->lchild);
		cout<<T->data<<" ";
		DiguiIn(T->rchild);
	}
	return 1;
}
Status DiguiPost(BitTree &T)
	//递归后序
{
	if(T)
	{
		DiguiPost(T->lchild);
		DiguiPost(T->rchild);
		cout<<T->data<<" ";
	}
	return 1;
}
void Preorder(BitTree root)
{ 
  BitTree p,s[100];
  int top=0;  //top为栈顶指针
  p=root;
  while((p!=NULL)||top>0)
  {       
	  while(p!=NULL)
        { 
			cout<<p->data<<" ";
            s[top++]=p;
            p=p->lchild;     
        }
	  if(top>0)
           {
			   p=s[top--]; 
		       p=p->rchild;
	       }
  }
}
void Inorder(BitTree root) /* 中序遍历二叉树, root为二叉树的根结点 */
{
     BitTree p,s[100];
	 int top=0;
	 p=root;
	 while(p!=NULL||top!=0)
	 {
		 while(p!=NULL)
		 {
			 top++;
			 s[top]=p;
			 p=p->lchild;
		 }
		 if(top>0)
		 {
			 p=s[top];
			 top--;
			 cout<<p->data<<" ";
			 p=p->rchild;
		 }
	 }
}
void Postorder(BitTree root)
{  
   BitTree p,s1[100];               //s1栈存放树中结点
   int s2[100],top=0,b;           //s2栈存放进栈标志
   p=root;
   do
   {  
	   while(p!=NULL)
           {
			   s1[top]=p;  
			   s2[top++]=0;    //第一次进栈标志为0
               p=p->lchild;
	       }
       if(top>0)
	   {
		   b=s2[--top];
	       p=s1[top];
       if(b==0)
	   {
		   s1[top]=p;   
		   s2[top++]=1;  //第二次进栈标志
		   p=p->rchild;
	   }
      else
	   {
		  cout<<p->data<<" ";
	      p=NULL;
	   }
    } // if(top>0)
   }while((p!=NULL)||(top>0));
}
int main()
{
	int op;
	BitTree Tree;
	cout<<"请输入数据:\n";
	if(CreatBitTree(Tree))
	cout<<"请输入你想要的操作:\n";
	cout<<"操作1:先序遍历(递归)\n";
	cout<<"操作2:中序遍历(递归)\n";
	cout<<"操作3:后序遍历(递归)\n";
	cout<<"操作4:先序遍历(非递归)\n";
	cout<<"操作5:中序遍历(非递归)\n";
	cout<<"操作6:后序遍历(非递归)\n";
	cin>>op;
	switch(op)
	{
	case 1:DiguiPre(Tree);break;
	case 2:DiguiIn(Tree);break;
	case 3:DiguiPost(Tree);break;
	case 4:Preorder(Tree);break;
	case 5:Inorder(Tree);break;
	case 6:Postorder(Tree);break;
    }
return 0;
}


展开阅读全文

没有更多推荐了,返回首页