回答:
バイナリツリー:各ノードに最大2つの葉があるツリー
1
/ \
2 3
バイナリ検索ツリー:検索に使用されます。左側の子に親ノードより小さい値のノードのみが含まれ、右側の子に親以上の値のノードのみが含まれるバイナリツリー。
2
/ \
1 3
Binary Treeは、2つの子(左側の子と右側の子)を持つツリーの特殊な形式です。それは単にツリー構造でのデータの表現です
二分探索木(BST)は、次の条件に従う特殊な二分木です。
バイナリツリーはノードで構成され、各ノードには「左」ポインタ、「右」ポインタ、およびデータ要素が含まれます。「ルート」ポインターは、ツリーの最上位ノードを指します。左と右のポインタは、どちらかの側の小さな「サブツリー」を再帰的に指します。nullポインタは、要素のないバイナリツリー、つまり空のツリーを表します。正式な再帰的な定義は次のとおりです。バイナリツリーは空(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);
}
それがあなたを助けることを願っています。ここで言及する価値があると感じたので、トピックから逸れてしまった場合は申し訳ありません。
バイナリツリーは、2つの子参照のみを持つことができるノードで構成されるデータ構造を表します。
一方、バイナリ検索ツリー(BST)は、各ノードが同等の値を持ち、小さい値の子が左に接続され、大きい値の子が右に接続されているバイナリツリーデータ構造の特殊な形式です。
したがって、すべてのBSTはバイナリツリーです。が、一部のバイナリツリーもBSTになる場合があります。BSTがBinary Treeのサブセットであることを通知します。
したがって、二分木はより一般的なデータ構造ですバイナリサーチツリー。また、バイナリ検索ツリーはソートされたツリーであることを通知する必要がありますが、一般的なバイナリツリーにはそのようなルールのセットはありません。
あ Binary Tree
ではありませんBST
。
5
/ \
/ \
9 2
/ \ / \
15 17 19 21
あ バイナリ検索ツリーもあるバイナリツリー。
50
/ \
/ \
25 75
/ \ / \
20 30 70 80
親ノードについても通知します、BSTのます。
左側のすべてのノードの値は、親ノードの値よりも小さくなっています。上の例では、値{20、25、30}のノードはすべて左側にあります。 50の(左の子孫)にあり、50未満です。
すべての右側のノードは、親ノードの値よりも大きな値を持っています。上の例では、値が{70、75、80}で、すべて右側にあるノード(右側の子孫)にある50が50を超えています。
二分木ノードにはそのような規則はありません。Binary Tree Node の唯一のルールは2つの子を持つことです。そのため、なぜBinaryと呼ばれたのかがわかります。
二分木
バイナリツリーは、2つの子と1つの親を持つものであれば何でもかまいません。リンクされたリストまたは配列として、またはカスタムAPIを使用して実装できます。より具体的なルールを追加し始めると、より専門的なツリーになります。最も一般的な既知の実装は、左側に小さなノードを追加し、右側に大きなノードを追加することです。
たとえば、値が2であるルートノードを持つ、サイズ9、高さ3のラベル付きバイナリツリー。ツリーは不均衡で、ソートされていません。 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です。
二分探索木
これは、バイナリツリーの実装の1つです。これは検索に特化しています。
二分探索木とBツリーデータ構造は、二分探索に基づいています。
時系列またはソートされたバイナリツリーと呼ばれることもあるバイナリ検索ツリー(BST)は、特定の種類のコンテナーです。https://en.wikipedia.org/wiki/Binary_search_tree
サイズが9、深さが3のバイナリ検索ツリー。ルートは8です。葉は描かれていません。
そして最後に、よく知られたデータ構造と適用されたアルゴリズムのパフォーマンス比較のための優れたスキーマ:
アルゴリズム(第4版)から取得した画像
特定のバイナリツリーがバイナリ検索ツリーであるかどうかを確認するには、次の方法があります。
ツリーを順番にトラバースツリー(つまり、左の子->親->右の子)、トラバースしたノードのデータを一時変数に保存すると、tempに保存する直前にtempと言い、現在のノードのデータが前のデータよりも高いかどうかを確認します。次に、それを分解します。ツリーはバイナリ検索ツリーではなく、最後まで走査します。
以下は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;
}
外部の一時変数を維持する