#include <iostream>
#include <stack>node
using namespace std;ios
typedef struct bitreenode
{
char data;
struct bitreenode *lchild,*rchild;
}*Bitree;函數
//建立二叉樹
void createbitree(Bitree &T)
{
char data;
data=getchar();
if(data=='#')
{
T=NULL;
}
else
{
T=new bitreenode;
T->data=data;
createbitree(T->lchild);
createbitree(T->rchild);
}
};post
//遞歸的先序遍歷二叉樹
void preordertraverse(Bitree T)
{
if(T)
{
cout<<T->data<<" ";//輸出根結點
preordertraverse(T->lchild);
preordertraverse(T->rchild);
}
}spa
//遞歸的中序遍歷二叉樹
void inordertraverse(Bitree T)
{
if(T)
{
inordertraverse(T->lchild);
cout<<T->data<<" ";//輸出根結點
inordertraverse(T->rchild);
}
}遞歸
//遞歸的後序遍歷二叉樹
void postordertraverse(Bitree T)
{
if(T)
{
postordertraverse(T->lchild);
postordertraverse(T->rchild);
cout<<T->data<<" ";//輸出根結點
}
}get
//求二叉樹的深度
int depthofbitree(Bitree T)
{
int ldepth;
int rdepth;
if(T==NULL) //空樹
{
return 0;
}it
ldepth=depthofbitree(T->lchild);
rdepth=depthofbitree(T->rchild);io
if(ldepth>rdepth)
return ldepth+1;
else
return rdepth+1;
}stream
//求二叉樹的葉子結點
int leafcount(Bitree T)
{
if(T==NULL)
{
return 0;
}
else if(T->lchild==NULL && T->rchild==NULL)
{
return 1;
}
else
{
int n=leafcount(T->lchild);//求左子樹葉子的數目
int m=leafcount(T->rchild);//求右子樹葉子的數目
return n+m;
}
}
//求二叉樹T中度爲1的結點的數量
int onesoncount(Bitree T)
{
if(T==NULL)
{
return 0;
}
else if((T->lchild==NULL && T->rchild!=NULL) ||(T->lchild!=NULL && T->rchild==NULL))
{
cout<<"度爲1的結點的字母爲:"<<T->data<<endl;
return (onesoncount(T->lchild) +onesoncount(T->rchild) +1);
}
else
{
return (onesoncount(T->lchild) +onesoncount(T->rchild));
}
}
//求非葉子結點的數目
int notleafcount(Bitree T)
{
if(T==NULL)
{
return 0;
}
else if(T->lchild == NULL && T->rchild == NULL)
return 0;
else
{
cout<<T->data; //輸出非終端結點的值
int n=notleafcount(T->lchild); //左子樹非終端結點的數目
int m=notleafcount(T->rchild); //右子樹非終端結點的數目
return (m+n+1);
}
}
//求二叉樹的所有結點數目
int node_num(Bitree T)
{
if(T==NULL)
return 0;
else
return node_num(T->lchild)+node_num(T->rchild)+1;
}
///////////////主函數///////////////
void main()
{
Bitree t=NULL;
printf("請按如下兩種序列輸入二叉樹的結點:\n");
printf("AB#D##CE### 或 ABD##E##C#F##\n");
createbitree(t);
cout<<"先序遍歷:";
preordertraverse(t);
cout<<endl;
cout<<"中序遍歷:";
inordertraverse(t);
cout<<endl;
cout<<"後序遍歷:";
postordertraverse(t);
cout<<endl;
cout<<"二叉樹的深度爲:"<<depthofbitree(t)<<endl;
int leaf=0; //葉子結點數目,初始化爲0
leaf=leafcount(t);
cout<<"葉子結點數爲:"<<leaf<<endl;
int oneson=0; //度爲1的結點數目
oneson=onesoncount(t);
cout<<"度爲1的結點的數量爲:"<<oneson<<endl;
int notleafcount_=0; //非葉子結點的數目,初始化爲0
cout<<"非葉子結點爲:";/////////////
notleafcount_=notleafcount(t);//////////////????????
cout<<endl;
cout<<"非葉子結點的數量爲:"<<notleafcount_<<endl;
int node_number=0; //初始化所有結點的數目爲0
node_number=node_num(t);
cout<<"二叉樹所有結點的數量爲:"<<node_number<<endl;
}