【PTA】6-9二叉樹的遍歷
題目描述
要求分別實現二叉樹的四種遍歷
即前中後以及層序遍歷
接口定義如下
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
解題思路
前中後序遍歷倒是比較簡單,本身二叉樹就是遞歸地定義的,在哪個序就將輸出語句放在哪個位置就可以了。
比較麻煩的是層次遍歷
層次遍歷實則對應的是圖的搜索算法中的BFS,但由於二叉樹的性質,如果還建立個隊列、將鄰節點依次入隊又出隊,未免顯得太過於複雜
此處考慮引入數組,分別設置一個head值和tail值,用以存儲迭代遍歷時候的值。當head==tail,說明搜索完畢,停止輸出
代碼
void PreorderTraversal( BinTree BT )
{
if (BT==NULL)
return;
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void InorderTraversal( BinTree BT )
{
if (BT==NULL)
return;
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ){
if (BT==NULL)
return;
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT ){
if (BT==NULL)
return;
BinTree binTree[100];
int head=0,tail=0;//初始條件都是0
binTree[tail++]=BT;//結束設爲節點數
while(head<tail){
BinTree temp=binTree[head++];//逐層搜索
printf(" %c", temp->Data);
if(temp->Left) binTree[tail++]=temp->Left;
if(temp->Right) binTree[tail++]=temp->Right;//從左往右搜索
}
}
總結
前中後序較爲常用且易於理解
層次遍歷經常容易想到的是BFS,而採用輔助數組也是BFS在二叉樹上的“變種”