データ構造とアルゴリズム - 検索アルゴリズム - とバイナリツリー検索

 ################################################## ######

「」」
ツリー
1.ツリーとは何ですか?
図ツリーがNであるデータ構造である(N> = 1)階層関係を有するノードの有限集合。
それは上向き、下向きや葉のルートであることを意味逆さまの木のように見えるので、私たちは「木」と呼んでいます。

それは次の機能があります。
各ノードは、ゼロ個以上の子ノードを有しています。
親ノードがルートノードと呼ばれていません。
各非ルート・ノードは、唯一の親ノードを持っています。
ルートノードに加えて、子ノードは互いに素サブツリーの複数の各々に分割することができます。

いくつかの概念:
学位ノード:複数の下位ノードがあることを、
木の、それはノードの最大である、木のあります
リーフノード、子を持たないノード
親ノード、ノード・レベル、
次のレベルでの子ノード、
父親のノードと兄弟、
ノード層、
木の高さや深さは、最大の層であり、
「」」

 

 

 ################################################## ######

「」 " 第二に、バイナリツリー


、ツリーの木が命じたと順序付けられていない木、我々は唯一のバイナリツリーを命じた研究します 1、バイナリツリーは何ですか? 二分木、木は2よりも悪くないです(ノードは多くても2つのフォークに有します) 2、バイナリの分類: #1、完全なバイナリツリー: 左端の二分木層の複数の位置に集中している下層と最下部層とノードの下層に一度リーフノードのみが表示されること #2、完全なバイナリツリー 各階層のノードの数が最大値に達した場合に二分木は、二分木は、完全二分木です。 完全なバイナリツリーは、完全なバイナリツリーでなければなりませんが、必ずしもそうではない、完全なバイナリツリーは完全なバイナリツリーです #3、バランスバイナリツリー #4、バイナリ・ソートツリー
「」」

 

 ################################################## ######

「」」

第三に、バイナリツリーストレージ

バイナリシーケンステーブルは、ストレージのために使用することができます、
しかし、ツリーやチェーン店の使用は、二つのノードを接続することで、
一般的なシーンツリーのアプリケーション、HTMLツリー構造で、
シナリオツリーは非常に多くあり、

図1に示すように、チェーンストレージ
、チェーン店は、バイナリ:バイナリツリーのノードは、ノード間のリンクを介して接続されたリンクリストに類似のオブジェクトとして定義されます。
B、ノードの定義
クラスBiTreeNode:
    #Data値がノードに渡されます。def __init __(自己、データ)
        self.data =データ
        self.lchild =なし
        self.rchild =なし

C、バイナリツリートラバーサル:

私は、最初の(フロント)先行順:ルート・ノードにアクセスするには、その左と右のサブツリーを横断する前に発生します

   何をするには:バイナリツリーが空でない場合は、順番に次の操作を行います。
⑴ルートノードにアクセスします。
⑵左のサブツリーをトラバース。
⑶右のサブツリーをトラバース。
II、INORDERトラバーサル:操作にアクセスすること、その左右のサブツリートラバーサル(間)の根で発生します。

     何をするには:バイナリツリーが空でない場合は、順番に次の操作を行います。
⑴左のサブツリーをトラバース。
⑵rootアクセス。
⑶右のサブツリーをトラバース。
III、後順は:ルートノードにアクセスする左右のサブツリーを横断した後に発生します。

      バイナリツリーが空でない場合は、順番に次の操作を行います。
⑴左のサブツリーをトラバース。
⑵右のサブツリーをトラバース。
⑶rootアクセス。
IVは、レベルを通過します
キューは、現在のノードが左と右のトラバーサル順序を達成するために、子供によってアクセスされて保持しています。

「」」

 

#######################ため##################バイナリツリートラバーサルコード

クラスノード(オブジェクト):
"" " 节点类""" 
    デフ __init__(自己、elemは= -1、lchild =なし、rchild = なし):
        self.elem = 要素
        self.lchild = lchild   2人の子供がいる 
        self.rchild = rchild

クラスツリー(オブジェクト):
     "" " 树类""" 
    デフ __init__(自己、ルート= なし):
        self.root = ルート

    DEF の追加(セルフ、ELEMは):
         「」「ツリーにノードを追加「」」
        ノード = ノード(elemは)
         ツリーが空の場合、ルートノードの割り当て
        IF self.root == なし:
            self.root = ノード
         
            キュー = []
            queue.append(self.root)
            既存のノードレベルをトラバース
            しながら:キュー   終了条件は、キューが空であることで、
                キューの最初の要素ポップ 
                CUR = (0)queue.popを
                 IF cur.lchild == :なし
                    cur.lchild = ノード
                     リターン
                のelif cur.rchild == なし:
                    cur.rchild = ノードを
                     返す
                #を左と右のサブツリーが空でない場合は、キューが追加判断を継続し
                    queue.append(cur.lchildを)
                    queue.append(cur.rchild)


    ツリートラバーサル
    ############################################# ###################### 
    #の幅優先トラバーサル
    DEFのbreadth_travel(自己):
         「」「使用キュー実装ツリー階層トラバーサル」「」
        IF self.root = = なし:
             リターン
        キュー = [self.root]
         一方キュー:
            ノード = queue.pop(0)
             印刷(node.elem)
             の場合 node.lchild =!なし:
                queue.append(node.lchild)
            もし node.rchild =!なし:
                queue.append(node.rchild)

    ################################################# ################ 
    深さ優先探索の
    3つの方法があります
    このトラバーサルコードコントロールすることはできませんが、私たちは、あなたが、あなたがバイナリツリーを引き出すことができます注文番号でなければなりません、逆にする必要があります押して押している
    前順、優先順位は常にルートノードとなり、左右の
    DEFの先行順(セルフ、ルートを):
         「」「再帰予約限定」「」
        のIFルート== なし:
             リターン
        を印刷(root.elem)
        self.preorder(root.lchild)
        self.preorder(root.rchild)

    予約限定:左、右、
    DEF 順序どおり(セルフ、根):
         「」「再帰予約限定」「」
        IF:ルート==なし   これは、終了条件再帰的で
            復帰
        self.inorder(root.lchild)
        印刷(root.elem)
        self.inorder(root.rchild)

    以降のトラバーサル、右と左、
    DEFの後順(セルフ、根):
         「」「再帰以降のトラバーサル」「」
        IFルート== なし:
             リターン
        self.postorder(root.lchild)
        self.postorder(root.rchild)
        印刷(root.elem)


もし __name__ == ' __main__ ' 
    ツリー = 木()
    tree.add( 1 
    tree.add( 2 
    tree.add( 3 
    tree.add( 4 
    tree.add( 5 
    tree.breadth_travel()

 

##############################################

  

##############################################

 ##############################################

 

おすすめ

転載: www.cnblogs.com/andy0816/p/12348246.html