バイナリ検索ツリー
バイナリ検索ツリーは、アイデアから明らかである:バイナリ検索。
バイナリ検索ツリー
それは明らかです。
-
バイナリ検索ツリーは、完全2分木である必要はありません
-
すべてのノードの左の部分木は、根の値未満であった。すべてのノードの右の部分木の値は、そのルート・ノードの値よりも大きい、その左右のサブツリーは2であります二分探索木。
二分探索木、以下の一般的な操作の場合:
1つの挿入、削除
2検索
トラバース3:(三つの方法の後に、シーケンスで、プリアンブルを含む)を深さ優先トラバーサル、幅優先トラバーサル
挿入の目的のために:比較的単純なプロセスです。自身がコードを達成するためだと思います。
削除操作が面倒で、話すことはありません。
検索それに対する操作、およびほとんど差を挿入し、話すことはありません。
深さ優先探索の三つのレベルについて:先行順ノードが順番に出力することができ、バイナリツリーの先行順走査は、バイナリツリーの(破壊を破壊するために使用することができた後、あなたは左の子を削除する必要があり、その後、その後、ルートノードを右の子ノードを削除し、。
私たちは、幅優先トラバーサルを集中してみましょう:
イラストバイナリ検索ツリーの場合は、結果の明らか幅優先トラバーサルは次のとおりです。40,30,50,35,48,52,45だからの計算にこのようなものを実装する方法?
核となるアイデアは、次のとおりです。図のように、キューを使用しています。
彼らは子ノードについて持っている場合は、チームへのルートノード40は、40チーム、左と右の子ノードは、チームに変身して、チームの(約)子ノード、一度チーム、子ノードのチェックも程度でありますもしそうなら、ノードは、チームの中に子ノードを継続するために、子供を持っています。
コアは、子ノードが存在する場合があれば、チームが運転を終えたびに、チームはチームの中に、子ノードを現在のノードをチェックすることです。まで、キューが空であります!
バイナリ・ソートツリーを説明するために以下の質問を削除します。
図を示し、上記の3つのバイナリソートツリーノードを除去3。ケース:
-
削除されたノードがリーフノードであります
-
ノードは一つだけの子ノード(左の子か右の子)を削除しました
-
ノードは、子どもたちだった取り外さ(サブツリー)
针对情况1:直接将节点删除即可
针对情况2:用删除节点的孩子节点代替删除节点
针对情况3:我们需要考虑其前驱或者后继节点(前驱节点是key值上比该节点小的前一个节点,后继是key值比该节点大的后一个节点)。我们用该节点的前驱节点或者后继节点替代该节点:例如上图中我们用key值为45的节点或key值为52的节点替代key值为50的节点。
关于二叉搜索树的总结和思考:
二叉搜索树的定义已经说明了,它存在的意义就是为了更快速的查找。使得我们线性表下的的查找效率,降低为。但同时我们应该明白:由于二叉排序树只是宽泛的说明了节点键值的关系,对于树的结构并没有严格的限制,那么这样的树也可能是非平衡的。这将会导致查找效率的降低,极端的条件下直接退化为链表。为此,才会有类似于平衡树这些概念。