实现二叉树的前中后遍历以及遍历的应用

代码如下:

#include<iostream> 
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void PreOrderTraverse(BiTree T)
{//先序 
    if(T==NULL) return;
    else{
         cout << T->data;  //访问根结点 
	     PreOrderTraverse(T->lchild); //先序遍历左子树 
	     PreOrderTraverse(T->rchild); //先序遍历右子树
	    } 
}	

void InOrderTraverse(BiTree T)
{//中序 
    if(T==NULL) return;
    else{
	     InOrderTraverse(T->lchild); //中序遍历左子树 
	     cout << T->data;  //访问根结点 
	     InOrderTraverse(T->rchild); //中序遍历右子树
	    } 
}

void PostOrderTraverse(BiTree T)
{//后序 
    if(T==NULL) return;
    else{
	     PostOrderTraverse(T->lchild); //后序遍历左子树 
	     PostOrderTraverse(T->rchild); //后序遍历右子树
	     cout << T->data;  //访问根结点
	    } 
}	    	    
	    
void CreateBiTree(BiTree &T)
{//先序遍历的顺序建立二叉链表
    char ch; 
	cin >> ch;
	if(ch=='#') T=NULL; //递归结束,建空树 
	else
	{
		T=new BiTNode; //生成根结点 
		//或T=(BiTNode*)malloc(sizeof(BiTNode));
		T->data=ch;    //根结点数据域置为ch 
		CreateBiTree(T->lchild); //递归创建左子树 
		CreateBiTree(T->rchild); //递归创建右子树 
	}
 } 
 
void Copy(BiTree T,BiTree &NewT)
{//复制二叉树
 	if(T==NULL)   //如果是空树,递归结束 
 	{
 		NewT=NULL;
 		return;
	}
	else
	{
		NewT=new BiTNode;
		NewT->data=T->data;  //复制根结点 
		Copy(T->lchild,NewT->lchild); //递归复制左子树 
		Copy(T->rchild,NewT->rchild); //递归复制右子树 
	}
} 
  
int Depth(BiTree T)
{//计算二叉树的深度
    int m,n;
	if(T==NULL) return 0;   //空树,深度为0,递归结束 
	else
	{
		m=Depth(T->lchild); //递归计算左子树的深度记为m 
		n=Depth(T->rchild); //递归计算右子树的深度记为n 
		if(m>n) return (m+1);//二叉树的深度为m与n的较大者加1 
		else return (n+1);
	}
 } 
 
int NodeCount(BiTree T)
{//统计二叉树中结点的个数
	if(T==NULL) return 0;  //空树,则结点个数为0,递归结束 
	else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
	//结点个数为左子树的结点个数+右子树的结点个数+1 
 } 

int LeadCount(BiTree T)
{//计算二叉树叶子结点数
	if(T==NULL) return 0; //空树返回0 
	if(T->lchild==NULL && T->rchild==NULL)
	  return 1;           //叶子结点返回1 
	else
	  return LeadCount(T->lchild)+LeadCount(T->rchild);  
 } 
 
int main()
{
	BiTree T,newT,t;
	int x;
	cout <<"二叉树的简单实现:"<<endl; 
	cout<<"输入每个结点的元素:";
	CreateBiTree(T);
	cout <<endl;
	
	cout <<"先序遍历:" <<endl;
	PreOrderTraverse(T);
	cout <<endl<<endl;
	
	cout <<"中序遍历:" <<endl;
	InOrderTraverse(T);
	cout <<endl<<endl;
	
	cout <<"后序遍历:" <<endl;
	PostOrderTraverse(T);
	cout <<endl<<endl;
	
	cout <<"复制二叉树:"<<endl;
	Copy(T,newT);
	cout <<"复制前序遍历:"; 
	PreOrderTraverse(newT);
	cout <<endl; 
	cout <<"复制中序遍历:"; 
	InOrderTraverse(newT);
	cout<<endl;
	cout <<"复制后序遍历:"; 
	PostOrderTraverse(newT);
	cout <<endl<<endl;
	
	cout <<"计算二叉树的深度:"<<endl;
	x=Depth(T); 
	cout <<x<<endl<<endl;
	
	cout <<"二叉树中结点的个数:"<<endl;
	x=NodeCount(T);
	cout <<x<<endl<<endl; 
	
	cout <<"二叉树叶子结点数:"<<endl;
    x=LeadCount(T); 
    cout <<x<<endl;
}  

在这里插入图片描述
输入时一定要按照先序的顺序输入字符元素

发布了33 篇原创文章 · 获赞 81 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wmy0217_/article/details/104176661