誰でもどうぞ二分木と二分探索木例で?
二分木:各ノードが最大2枚の葉を持つ木
1
/ \
2 3
二分探索木:検索に使用されます。左側の子が親ノードより小さい値を持つのみのノードを含み、右側の子のみがノードを含む二分木親以上の値を持つ。
2
/ \
1 3
バイナリツリーは、2人の子供(左の子供と右の子供)を持つ特殊な形式のツリーです。それは単に木構造のデータの表現です
バイナリサーチツリー(BST)は、次の条件に従う特別なタイプのバイナリツリーです。
二分木はノードからなり、各ノードは "左"ポインタ、 "右"ポインタ、およびデータ要素を含みます。 「ルート」ポインタは、ツリーの最上位ノードを指します。左右のポインタは、両側の小さい「サブツリー」を再帰的に指しています。 NULLポインタは、要素のない2分木、つまり空の木を表します。形式的な再帰定義は次のとおりです。二分木は空(nullポインタで表される)か、左右のポインタ(前方の再帰定義)がそれぞれ二分木を指す単一ノードで構成されます。
二分探索木(BST)または「順序付き二分木」は、ノードが順番に並んでいる二分木の一種です。左側のサブツリーの要素はノード(<)よりも小さく、右側のサブツリーの要素はすべてノード(>)よりも大きいです。
5
/ \
3 6
/ \ \
1 4 9
上に示したツリーは二分探索ツリーです。「ルート」ノードは5、その左側のサブツリーノード(1、3、4)は<5、右側のサブツリーノード(6、9)は> 5です。再帰的に、各部分木も二分探索木の制約に従わなければなりません。(1、3、4)部分木では、3が根、1 <3と4> 3です。
問題の正確な表現に注意してください - "二分探索木"は "二分木"とは異なります。
上記の誰もが二分木と二分探索木の違いについて説明したように、私は与えられた二分木が二分探索木であるかどうかをテストする方法を追加しているだけです。
boolean b = new Sample().isBinarySearchTree(n1, Integer.MIN_VALUE, Integer.MAX_VALUE);
.......
.......
.......
public boolean isBinarySearchTree(TreeNode node, int min, int max)
{
if(node == null)
{
return true;
}
boolean left = isBinarySearchTree(node.getLeft(), min, node.getValue());
boolean right = isBinarySearchTree(node.getRight(), node.getValue(), max);
return left && right && (node.getValue()<max) && (node.getValue()>=min);
}
お役に立てば幸いです。私はそれがここでこれを言及する価値があると感じたので私がトピックから逸れているなら申し訳ありません。
バイナリツリー は データ構造を表します は ノード で構成できます のみ have 2人の子供 references 。
二分探索木 ( _ bst _ )一方、 二分木 の特殊な形式です。各 ノード は匹敵する値、そして左に小さい値の子供、右に大きい値の子供。
したがって、すべての _ bst _ は 二分木 ですが、 二分木 の一部だけが _ bst _ でも構いません。 _ bst _ が バイナリツリー のサブセットであることを通知します。
したがって、 バイナリツリー は、 バイナリ検索ツリー よりも一般的なデータ構造です。また、 バイナリ検索ツリー が sorted であることを通知する必要がありますが、一般的な バイナリツリー にはそのような規則はありません。
Binary Tree
は ではありません BST
;
5
/ \
/ \
9 2
/ \ / \
15 17 19 21
二分探索木 これは 二分木でもある ;
50
/ \
/ \
25 75
/ \ / \
20 30 70 80
また、 _ bst _ 内の任意の 親ノード についても通知します。
左側のすべてのノードは、親ノードの値よりも小さい値を持ちます。上の例では、 すべて左側にある ( 左側の子孫 )である値{20、25、30}のノードは50より小さいです。
すべての正しいノードは、親ノードの値よりも大きい値を持ちます。上の例では、 すべて右側にある ( 右側の子孫 )の値が{70、75、80}のノードは50を超えています。
バイナリツリー Nodeにはそのような規則はありません。 バイナリツリー Nodeの唯一のルールは2人の子供を持つことなので、それがなぜ binary と呼ばれるかを自己説明します。
二分探索木は特別な種類の二分木で、次の特性を示します。任意のノードnに対して、nの左側のサブツリーのすべての子孫ノードの値はnの値より小さく、右側のサブツリーのすべての子孫ノードの値はnの値より大きい。
二分木
二分木はanythingであり、2人の子供と1人の親を持ちます。リンクリストまたは配列として、あるいはカスタムAPIを使って実装できます。もっと具体的なルールを追加し始めると、more専門のツリーになります。最も一般的な既知の実装は、左側に小さいノードを、右側に大きいノードを追加することです。
たとえば、サイズが9で高さが3で、値が2のルートノードを持つラベル付きのバイナリツリー。ツリーはアンバランスでソートはされていません。 https://en.wikipedia.org/wiki/Binary_tree
たとえば、左側のツリーでは、Aに6人の子{B、C、D、E、F、G}がいます。それは右側の二分木に変換することができます。
バイナリ検索
二分検索は、ノードチェーン上の特定の項目を見つけるために使用される手法/アルゴリズムです。ソートされた配列に対して二分検索が機能します。
二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが嘘をつくことができない半分は排除され、それが成功するか残りの半分が空になるまで残りの半分で検索が続けられます。 https://en.wikipedia.org/wiki/Binary_search_algorithm
二分探索を表すツリー。ここで検索されている配列は[20、30、40、50、90、100]で、目標値は40です。
二分探索木
これは二分木の実装の一つです。これはsearchingに特化しています。
二分探索木およびB木データ構造は、二分探索に基づいています。
バイナリー検索ツリー(BST)は、順序付きまたはソート済みバイナリーツリーとも呼ばれ、特定のタイプのコンテナー:「項目」を格納するデータ構造(数字、名前など)メモリー内にあります。 https://en.wikipedia.org/wiki/Binary_search_tree
サイズ9、深さ3で、根が8の二分探索木。葉は描かれていません。
そして最後に、よく知られたデータ構造と適用されたアルゴリズムの性能比較のための素晴らしいスキーマ
アルゴリズム(第4版) からの画像
二分木とは、子が二人以上になることのない木です。二分探索木は、左の子がルートノードのキーよりも小さい値を持ち、右の子がルートノードのキーよりも大きい値を持つという不変式に従います。
与えられた二分木が二分探索木であるかどうかを調べるには、ここでは代替アプローチです。
トラバースツリーインインオーダーファッション(つまり左チャイルド - >親 - >右チャイルド)、トラバースノードデータを一時変数に格納するとtemp、tempに格納する直前、現在のノードのデータがそれより高いかどうかを確認前のものかどうか。それからちょうどbreakしてください、TreeはBinary Search Treeではありません、そうでなければ最後までトラバースします。
以下はJavaの例です。
public static boolean isBinarySearchTree(Tree root)
{
if(root==null)
return false;
isBinarySearchTree(root.left);
if(tree.data<temp)
return false;
else
temp=tree.data;
isBinarySearchTree(root.right);
return true;
}
一時変数を外部に維持
二分探索木では、すべてのノードは特定の順序で並べられます - ルートノードの左側にあるノードはそのルートよりも小さい値を持ち、ノードの右側にあるすべてのノードはの値よりも大きい値を持ちます。ルート。
ツリーは、いずれかのノードの子の最大数が2である場合に限り、バイナリツリーとして呼び出すことができます。
ツリーは、いずれかのノードの子の最大数が2で、左側の子が常に右側の子よりも小さい場合に限り、バイナリ検索ツリーとして呼び出すことができます。