二叉樹
二叉樹結構定義如下
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
四種遍歷方式分別是 中序,先序,後序,層序。
具體例子如下:
二叉樹圖解:
四種遍歷輸出:
Inorder: D B E F A G H C I //中序
Preorder: A B D F E C G H I //先序
Postorder: D E F B H G I C A //後序
Levelorder: A B C D F G I E H //層序
先序,中序,後序
都是用遞歸輸出,只是根,左節點,右節點的輸出順序不一樣
void InorderTraversal( BinTree BT ){//中序
if(!BT)
return;
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ){ //先序
if(!BT)
return;
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ){//後序
if(!BT)
return;
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
層序
需要定義兩個數組存節點,一個存當前節點並輸出data,另一個存這個節點下的左右節點。
void LevelorderTraversal( BinTree BT ){//層序
if(!BT)
return;
int len=1,pos;
BinTree a[101],b[101];
a[0]=BT;
while(1){
if(len==0)
return;
pos=0;
for(int i=0;i<len;i++)
{
if(a[i]!=NULL)//不爲空輸出
printf(" %c",a[i]->Data);
if(a[i]->Left!=NULL)//如果它的左節點不爲空,就存到b數組裏
b[pos++]=a[i]->Left;
if(a[i]->Right!=NULL)//如果它的右節點不爲空,就存到b數組裏
b[pos++]=a[i]->Right;
}
len=pos;//更新下一層寬度,爲下一次循環做準備
for(int i=0;i<len;i++)//將下層的b賦給a,爲下一次循環做準備
a[i]=b[i];
}
}