二叉樹按層次遍歷的遞迴用法
對於在學資料結構的大家,在編寫二叉樹的按層次遍歷時往往會用非遞迴的方法,或許有人會問可不可以用遞迴來做呢?
對此,小編的答案是可以的。
相對於非遞迴,遞迴稍微要複雜些(這是由於二叉樹中遞迴左子樹遞迴右子樹是完全與層次遍歷相悖的),為此需要藉助其他函式來實現
下面是小編寫的按層次遞迴遍歷二叉樹的程式碼:
小編的思路是這樣的:先編寫幾個函式,它們的功能分別是:計算二叉樹的深度(BitreeDepth(Bitreey P)),計算某個結點在二叉樹中的層次(BitreeLevel(Bitreey P,char e)),遍歷指定一層的結點( PreOderLevel(Bitreey P,Bitreey T,int n))。然後進入主函式:首先我把1賦給引數n,即從第一層開始遍歷,在到達最後一層之前,均以遞迴形式遍歷每一層。
#include<stdio.h>
#include<stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int status;
typedef char TElemType;
#define NULL 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct Bitree{
TElemType data;//資料
struct Bitree *lchild,*rchild;//左子樹與右子樹
}Bitree,*Bitreey;
Bitreey CreateBitree(Bitreey P)//按先序遍歷規則建立二叉樹,請輸入結點(不存在的結點用空格代替)
{
char ch;
scanf("%c",&ch);
if(ch==' ')P=NULL;
else{
if(!(P=(Bitreey)malloc(sizeof(Bitree))))exit(OVERFLOW);
P->data=ch;
P->lchild=(Bitreey)malloc(sizeof(Bitree));
P->rchild=(Bitreey)malloc(sizeof(Bitree));
P->lchild=CreateBitree(P->lchild);
P->rchild=CreateBitree(P->rchild);
}
return P;
}
//編寫演算法求二叉樹P(二叉連結串列儲存結構)的深度
status BitreeDepth(Bitreey P)
{
int rd,ld;
if(!P)return 0;
else
{
ld=BitreeDepth(P->lchild);
rd=BitreeDepth(P->rchild);
if(ld>rd)return ld+1;
else return rd+1;
}
}
//編寫演算法求e在二叉樹P中的層次。如果不存在返回值為0;否則返回值為層次
status BitreeLevel(Bitreey P,char e)
{
int ld,rd;
if(!P)return 0;
else if(e==P->data)return 1;
else if(e!=P->data)
{
ld=BitreeLevel(P->lchild,e);
rd=BitreeLevel(P->rchild,e);
if(ld)return ld+1;
else if(rd)return rd+1;
else return 0;
}
}
對於遍歷每一層,小編在這詳細講解一下:通過先序遍歷二叉樹的思路,我可以訪問每一個結點,並判斷每一個結點所在的層次是否等於我指定的層數,若相等,則輸出該結點。
status PreOderLevel(Bitreey P,Bitreey T,int n)//先序遍歷某一層次的元素並輸出
{
if(!P)return 0;
if(P&&T){if(BitreeLevel(P,T->data)==n)printf("%c ",T->data);
PreOderLevel(P,T->lchild,n);
PreOderLevel(P,T->rchild,n);}
return OK;
}
//按層次遞迴遍歷
status levelTraverse(Bitreey P,int n)
{
if(!P)return ERROR;
else if(P){PreOderLevel(P,P,n);printf("\n");}
if(n+1<=BitreeDepth(P))
levelTraverse(P,n+1);
return OK;
}
int main()
{
Bitreey P;
P=(Bitreey)malloc(sizeof(Bitree));
printf("請輸入二叉樹的元素:\n");
P=CreateBitree(P);
levelTraverse(P,1);
return 0;
}
這是小編第一次寫部落格,如果有錯誤或不妥的地方,望指出,小編會盡量改善,謝謝。