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###