【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在二叉树上的“变种”