記事のディレクトリ
トラバーサルのコンセプト
バイナリツリーノードにおける探索経路に沿ったツアーは、そのような各ノードは一度訪問され、一度だけアクセスされます。
情報出力ノード等:「アクセス」とは、次のような、非常に広いことができます。
「トラバース」は、直鎖構造のための操作の任意のタイプ、およびのみ検索パス(各ノードは両方の唯一の後継者を有するため)であり、それは付加的な議論を必要としません。と非線形構造バイナリ、各ノードは、通過する問題が何であるかに応じて探索経路を横断する方法、すなわち2つの後継を有します。
検索パス
「バイナリツリー」が懸念されるために、3つの検索パスが存在することができます:
- 最初に階層を横断した後、
- 左から右に(サブツリー)トラバーサルリア(サブツリー)。
- まず(サブツリー)トラバーサルリア右(サブツリー)左。
トラバーサルのアルゴリズム(非再帰)
予約限定!
二分木が空の場合、エアオペレーション、そうでない場合、
- アクセスルートノード。
- 左のサブツリーを前順。
- 右のサブツリーを前順。
予約限定!
二分木が空の場合、エアオペレーション、そうでない場合、
- 左のサブツリーを前順。
- アクセスルートノード。
- 右のサブツリーを前順。
後順
二分木が空の場合、エアオペレーション、そうでない場合、
- 左の部分木の順序を横断した後、
- 右のサブツリーを後順。
- アクセスルートノード。
先行順走査コード説明
void preOrder(BiTree T, void(*visit)(int &e){
//先序遍历二叉树
if(T){
visit(T->data); //访问节点
preOrder(T->lchild, visit); //遍历左子树
preOrder(T->richild, visit); //遍历右子树
}
}
トラバーサルアルゴリズム(再帰)
予約限定!
スタックポインタのストレージノードを使用して、中央行きがけ知られているプロセスを返す必要があり、最初のスキャン(アクセスできません)左のすべてのノードのルートノードとスタックにそれらの一つ一つ。
そして、それをアクセスし、そこには左の子ノードの左の子ノードではないか、ノードが訪問したことは明らかである、ノードをポップ。
スタックが空になるまで、次にスタックである右の子ノード、の接合をスキャンし、その後、スタック内のすべての左と右の子ノードのノードおよび11をスキャンするので、この方法。
void inOrder(BtTree root){
initStack(&S); //初始化栈
p = root;
while(p != NULL || !StackEmprt(S)){
if(p != NULL){
//根指针进栈,遍历左子树
Push(&S, p);
p = p->lchild;
} else {
//根指针出栈,访问根节点,遍历右子树
Pop(%S, p);
Visit(p->data); //访问节点
p = p->rchild;
}
}
}
予約限定!
行きがけプロセスから、最初の左部分木、右部分木の最後の訪問を訪問し、その後、根をご覧ください。
したがって、スタックへの最初のルートノードは、スタックが空のサイクルではない:スタックp
、アクセス*p
、ノード、スタックにその右の子ノード、およびスタックに子ノードを残しました。
void preOrder(BtTree root){
initStack(&S);
p = root;
if(root != NULL){
Push(&S,p); //根节点进栈
while(!StackEmpty(S)){ //栈不空时循环
Pop(&S, p); //出栈并访问该节点
Visit(p->data);
if(p->rchild != NULL){
Push(&S,p)->rchild); //右孩子进栈
} else if(p->lchild != NULL){ //左孩子进栈
Push(&S, lchild);
}
}
}
}