二叉樹的遍歷應用1
阿新 • • 發佈:2018-12-21
二叉樹的遍歷是指按某種順序訪問樹中的每個結點。由於二叉樹具有遞迴的性質,一棵非空的二叉樹可以看成是由根結點、左子樹和右子樹三部分組成,依次遍歷這3個部分的資訊,也就遍歷了二叉樹。
完全二叉樹的順序儲存轉鏈式儲存
一顆完全二叉樹存放在於一個一維陣列T【n】中,從T【0】開始順序讀出各個結點的值,建立該二叉樹的連結串列表示
由於一維陣列從0號開始存放,所以結點i的左子女為2i+1,右子女為2i+2。
void A_to_L(Type T[],int n,int i,BiTNode *&p) {//利用引用型引數p將形參的值帶回實參 if(i>=n) { p=NULL; } else { p=(BiTNode*)malloc(sizeof(BiTNode));//建立根結點 p->data=T[i]; A_to_L(T,n,2*i+1,p->lchild); //遞迴建立左子女 A_to_L(T,n,2*i+2,p->rchild); //遞迴建立右子女 } }
完全二叉樹鏈式儲存轉順序儲存
同樣採用遞迴演算法,假設根t應存放於T【i】,則其左子女存放於T【2i+1】,右子女存放於T【2i+2】
void L_to_A(BiTNode *t,Type T[],int n,int i)
{
if(t==NULL) return;
if(i>=n)
{
cout<<"陣列空間不足"<<endl;
}
else
{
T[i]=t;
L_to_A(t->lchild,T,n,2*i+1);
L_to_A(t->rchild,T,n,2*i+2);
}
}
列印二叉樹的結點
鏈式儲存的二叉樹,以root(L,T)的形式輸出其各個結點
void print_BiT(BiTNode *t)
{
if(t!=NULL)
{
cout<<t->data;
if(t->lchild!=NULL||t->rchild!=NULL)
{
cout<<"(";
print_BiT(t->lchild);
if(t->rchild!=NULL)
{
cout<<",";
print_BiT(t->rchild);
}
cout<<")";
}
}
}
計算二叉樹中度為1的結點個數
若二叉樹為空,直接返回0;非空,依次統計根的左右子樹中的度為1的結點,再看根結點是否度為1;
int D_is_1(BiTNode *t)
{
if(t==NULL)
{
return 0;
}
else
{
if((t->lchild!=NULL&&t->rchild==NULL)||(t->lchild==NULL&&t->rchild!=NULL))
{
return (1+D_is_1(t->lchild)+D_is_1(t->rchild));
}
else
{
return(D_is_1(t->lchild)+D_is_1(t->rchild));
}
}
}
計算二叉樹中度為2的結點個數
int D_is_2(BiTNode *t)
{
if(t==NULL)
{
return 0;
}
else
{
if(t->lchild!=NULL&&t->rchild!=NULL)
{
return (1+D_is_2(t->lchild)+D_is_2(t->rchild));
}
else
{
return(D_is_2(t->lchild)+D_is_2(t->rchild));
}
}
}
計算二叉樹中度為0的結點個數
int D_is_0(BiTNode *t)
{
if(t==NULL)
{
return 0;
}
else
{
if(t->lchild==NULL&&t->rchild==NULL)
{
return 1;
}
else
{
return(D_is_0(t->lchild)+D_is_0(t->rchild));
}
}
}
統計二叉樹的高度
若二叉樹為空,高度為0;若其根結點即為葉結點,高度為1;否則統計其左右子樹的高度
int height(BiTNode *t)
{
if(t==NULL)
{
return 0;
}
else
{
int lheight,rheight;
lheight=height(t->lchild);
rheight=height(t->rchild);
return (1+(lheight>rheight)?lheight:rheight);
}
}
統計二叉樹中某個結點的深度
若結點p為根結點,返回t的層次(d,初始值為1);否則先遞迴左子樹查詢,未找到則遞迴右子樹,均未找到返回0;
int level(BiTNode *t,BiTNode *p,int d)
{
if(t==NULL)
{
return 0;
}
else if(t==p)
{
return d;
}
else
{
int subTreelevel;
if((subTreelevel=level(t->lchild,p,d+1))>0)
{
return subTreelevel;
}
else if((subTreelevel=level(t->rchild,p,d+1))>0)
{
return subTreelevel;
}
else
{
return 0;
}
}
}