C++實現遍歷二叉樹的各種遍歷操作| 函數模板拿走不送(帶解釋)!

C++實現遍歷二叉樹和簡單操作

C++代碼如下:

#include<iostream> 
#include<queue>    
#include<stack>

using namespace std;

typedef int Status;                   // Status 相當於 int 
typedef char TElemType;               //TElemType 相當於 char


typedef struct BiTNode{
	TElemType data;                   //結點數據域 
	struct BiTNode *lchild,*rchild;   //左右孩子指針 
}BiTNode,*BiTree;

Status PreOrderTraverse(BiTree T)   //遞歸先序遍歷   
{
    if(T==NULL) return 1;          //空二叉樹
    else{
         cout << T->data;             //訪問根結點 
	     PreOrderTraverse(T->lchild); //先序遍歷左子樹 
	     PreOrderTraverse(T->rchild); //先序遍歷右子樹
	    } 
}	

Status InOrderTraverse(BiTree T)    //遞歸中序遍歷  
{
    if(T==NULL) return 1;
    else{
	     InOrderTraverse(T->lchild); //中序遍歷左子樹 
	     cout << T->data;            //訪問根結點 
	     InOrderTraverse(T->rchild); //中序遍歷右子樹
	    } 
}


Status PostOrderTraverse(BiTree T)  //遞歸後序遍歷 
{
    if(T==NULL) return 1;
    else{
	     PostOrderTraverse(T->lchild); //後序遍歷左子樹 
	     PostOrderTraverse(T->rchild); //後序遍歷右子樹
	     cout << T->data;  //訪問根結點
	    } 
}	


void InOrderTraverse1(BiTree T)   //非遞歸中序遍歷 
{

	BiTree p; p=T;
	stack<BiTree> s; 
	while(p!=NULL|| !s.empty())
	{
		while(p!=NULL)
        {
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty())
        {
            p=s.top();
            cout << p->data;
            s.pop();
            p=p->rchild;
        }
	} // while 
}	

void PreOrderTraverse1(BiTree T)   //非遞歸先序遍歷 
{
    BiTree p;p=T;
    stack<BiTree> s;
    s.push(T);
    while(!s.empty())
    {
        p=s.top();//p爲空時相當於棧空
        s.pop();
        if(p!=NULL)
        {
            cout << p->data;
            s.push(p->rchild);//先壓右孩子結點,再壓左孩子結點
            s.push(p->lchild);
        }
    }
} 
void PostOrderTraverse1(BiTree T)  //非遞歸後序遍歷 
{
    BiTree p;p = T;
    BiTree q=NULL;
    stack<BiTree>s;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            s.push(p);
            p=p->lchild;
        }
        p=s.top();
        if(p->rchild == NULL || p->rchild == q)      
        {      
            cout<<p->data;      
            q = p;      
            s.pop();      
            p = NULL;      
        }      
        else    
            p = p->rchild;      // 否則訪問右孩子    
    } 
}

Status Copy(BiTree T,BiTree &NewT)   //複製二叉樹 
{
 	if(T==NULL)   //如果是空樹,遞歸結束 
 	{
 		NewT=NULL;
 		return 1;
	}
	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);  
 } 



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); //遞歸創建右子樹 
	}
 } //CreateBiTree



int main()
{
	BiTree T;
	BiTree NewT;//空的二叉樹用於複製
		
//	cout << "-------簡單實現二叉樹-------" << endl;
	cout <<  "請按照先序順序輸入每個結點:"; 
	CreateBiTree(T); cout << endl;
	
	cout <<"非遞歸先序遍歷:" <<endl;	
	PreOrderTraverse1(T);
	cout << endl <<"遞歸先序遍歷:" <<endl;	
	if(PreOrderTraverse(T))    //先序 
		cout <<  "  先序遍歷成功" << endl << endl; 
		
	cout <<"非遞歸中序遍歷:" <<endl;
	InOrderTraverse1(T);
	cout << endl <<"遞歸中序遍歷:" <<endl;
	if(InOrderTraverse(T))    //中序 
		cout <<  "  中序遍歷成功" << endl << endl; 
	
	
	cout <<"非遞歸後序遍歷:" <<endl;
	PostOrderTraverse1(T);	 
	cout << endl <<"遞歸後序遍歷:" <<endl;	
	if(PostOrderTraverse(T))    //後序 
		cout <<  "  後序遍歷成功" << endl << endl; 
	
	
	cout <<"複製二叉樹..."<<endl;
	if(Copy(T,NewT)) cout << "複製成功" << endl << endl; 
	
	int x;
	cout <<"計算二叉樹的深度:";
	x=Depth(T); 
	cout << x << endl << endl;
	
	cout <<"二叉樹中結點的個數:";
	x=NodeCount(T);
	cout << x << endl << endl; 
	
	cout <<"二叉樹葉子結點數:";
    x=LeadCount(T); 
    cout << x << endl;

	
	
	return 0;
}



下面加運行結果:
我們輸入的是這個二叉樹,看下結果

我們按照先序順序輸入:ABC##DE#G##F###
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章