データ構造 - バイナリツリートラバーサル

トラバーサルのコンセプト

バイナリツリーノードにおける探索経路に沿ったツアーは、そのような各ノードは一度訪問され、一度だけアクセスされます。

情報出力ノード等:「アクセス」とは、次のような、非常に広いことができます。

「トラバース」は、直鎖構造のための操作の任意のタイプ、およびのみ検索パス(各ノードは両方の唯一の後継者を有するため)であり、それは付加的な議論を必要としません。非線形構造バイナリ、各ノードは、通過する問題が何であるかに応じて探索経路を横断する方法、すなわち2つの後継を有します

検索パス

「バイナリツリー」が懸念されるために、3つの検索パスが存在することができます:

  1. 最初に階層を横断した後、
  2. 左から右に(サブツリー)トラバーサルリア(サブツリー)。
  3. まず(サブツリー)トラバーサルリア右(サブツリー)左。

トラバーサルのアルゴリズム(非再帰)

予約限定!

二分木が空の場合、エアオペレーション、そうでない場合、

  1. アクセスルートノード。
  2. 左のサブツリーを前順。
  3. 右のサブツリーを前順。

予約限定!

二分木が空の場合、エアオペレーション、そうでない場合、

  1. 左のサブツリーを前順。
  2. アクセスルートノード。
  3. 右のサブツリーを前順。

後順

二分木が空の場合、エアオペレーション、そうでない場合、

  1. 左の部分木の順序を横断した後、
  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);
            }
        }
    }
}

そして、モチーフ配列の先行順貢献バイナリツリー

ここに画像を挿入説明

おすすめ

転載: blog.csdn.net/hjc256/article/details/94292506