さて、このようなバイナリツリーがあります:
予約限定!
アイデアとコード
ノード、左の部分木、トラバーサル右部分木の順序:によると、
void PriorOrder(BTNode* b)
{
if(b)
{
printf("%c", b->data);
PriorOrder(b->lchild);
PriorOrder(b->rchild);
}
}
プロセス分析
まず、我々は最初の最上位ツリー(赤いボックス)を横断する
それぞれのルート、左サブツリー、右の部分木、青いボックスで囲んだ:この数は三つの部分に
我々第1のアクセスノード・Aその後、全体として青色のボックスで、左側にある左のサブツリーを、訪れ
A
右サブツリーを訪問し、左側のノード、Dを訪問し、その後、最初の訪問B:今、ビューからなる左サブツリーを分離同じです。
ABCの右ノード番号にアクセスするために開始し、その後、今、始まりとABCの数からなる左の部分木のルートノードが今、以上訪問している、アクセスE Hへのアクセス、その後、まだ同じ:私たちは、その後、右のサブツリーを提起しました
ABC木の右ノード:
上記と同様に、アクセスすることができます。
最終アクセス順:ABDEHCFIJG
予約限定!
アイデアとコード
よると:順序ノード、このノード、右ノードトラバーサルを残しました
void InOrder(BTNode* b)
{
if(b)
{
InOrder(b->lchild);
printf("%c", b->data);
InOrder(b->rchild);
}
}
プロセスが完了し、左部分木の最初の訪問ことを除いて、やはり上記と同じです。
出力順:DBHEAFJICG
その後のトラバーサル
アイデアとコード
左ノード、右ノード、このノードのトラバーサル順:によると、
void PostOrder(BTNode* b)
{
if(b)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c", b->data);
}
}
出力順:DHEBJIFGCA
レベルをトラバース
アイデアとコード
よると:ルート、第一層、第二層トラバーサルの順序...
void LevelTraversal(BTNode* b)
{
if(b)
{
//定义队列
BTNode* queue[MaxSize];
int top=0;
queue[top] = b;
int i = 0;
//只要队列里有元素
while(i<=top)
{
//将左右子树加入队列
if(queue[i]->lchild)
{
top++;
queue[top] = queue[i]->lchild;
}
if(queue[i]->rchild)
{
top++;
queue[top] = queue[i]->rchild;
}
i++;
}
//现在这个队列按层次顺序容纳了二叉树的每个节点
for(i=0;i<=top;i++)
{
//挨个打出来即可
printf("%c", queue[i]->data);
}
//我比较懒所以就没写出队,这其实当成个栈也可以
}
}
順序がABCDEFGHIJアクセスのあるレベルであることは明らかです