バイナリ検索ツリーで

バイナリ検索ツリー

バイナリ検索ツリーは、アイデアから明らかであるバイナリ検索

バイナリ検索ツリー

それは明らかです。

  • バイナリ検索ツリーは、完全2分木である必要はありません
  • すべてのノードの左の部分木は、根の値未満であったすべてのノードの右の部分木の値は、そのルート・ノードの値よりも大きい、その左右のサブツリーは2であります二分探索木

二分探索木、以下の一般的な操作の場合:

1つの挿入、削除

2検索

トラバース3:(三つの方法の後に、シーケンスで、プリアンブルを含む)を深さ優先トラバーサル、幅優先トラバーサル

挿入の目的のために:比較的単純なプロセスです。自身がコードを達成するためだと思います。

削除操作が面倒で、話すことはありません。

検索それに対する操作、およびほとんど差を挿入し、話すことはありません。

深さ優先探索の三つのレベルについて:先行順ノードが順番に出力することができ、バイナリツリーの先行順走査は、バイナリツリーの(破壊を破壊するために使用することができた後、あなたは左の子を削除する必要があり、その後、その後、ルートノードを右の子ノードを削除し、。

私たちは、幅優先トラバーサルを集中してみましょう:

イラストバイナリ検索ツリーの場合は、結果の明らか幅優先トラバーサルは次のとおりです。40,30,50,35,48,52,45だからの計算にこのようなものを実装する方法?

核となるアイデアは、次のとおりです。図のように、キューを使用しています。

彼らは子ノードについて持っている場合は、チームへのルートノード40は、40チーム、左と右の子ノードは、チームに変身して、チームの(約)子ノード、一度チーム、子ノードのチェックも程度でありますもしそうなら、ノードは、チームの中に子ノードを継続するために、子供を持っています。

コアは、子ノードが存在する場合があれば、チームが運転を終えたびに、チームはチームの中に、子ノードを現在のノードをチェックすることです。まで、キューが空であります!

バイナリ・ソートツリーを説明するために以下の質問を削除します。

図を示し、上記の3つのバイナリソートツリーノードを除去3。ケース:

  1. 削除されたノードがリーフノードであります
  2. ノードは一つだけの子ノード(左の子か右の子)を削除しました
  3. ノードは、子どもたちだった取り外さ(サブツリー)

针对情况1:直接将节点删除即可

针对情况2:用删除节点的孩子节点代替删除节点

针对情况3:我们需要考虑其前驱或者后继节点(前驱节点是key值上比该节点小的前一个节点,后继是key值比该节点大的后一个节点)。我们用该节点的前驱节点或者后继节点替代该节点:例如上图中我们用key值为45的节点或key值为52的节点替代key值为50的节点。

关于二叉搜索树的总结和思考:

二叉搜索树的定义已经说明了,它存在的意义就是为了更快速的查找。使得我们线性表下的的查找效率,降低为。但同时我们应该明白:由于二叉排序树只是宽泛的说明了节点键值的关系,对于树的结构并没有严格的限制,那么这样的树也可能是非平衡的。这将会导致查找效率的降低,极端的条件下直接退化为链表。为此,才会有类似于平衡树这些概念。

 

おすすめ

転載: www.cnblogs.com/shaonianpi/p/12088038.html