二分木と二分探索木の違い


回答:


566

バイナリツリー:各ノードに最大2つの葉があるツリー

  1
 / \
2   3

バイナリ検索ツリー:検索に使用されます。左側の子に親ノードより小さい値のノードのみが含まれ、右側の子に親以上の値のノードのみが含まれるバイナリツリー。

  2
 / \
1   3

14
@pete:これは概念的なものです。完全に制約のないものを実際に作成する必要はありません。ただし、バイナリヒープなど、他の点で特別な非検索バイナリツリーはたくさんあります。
user541686 2015

19
@pete二分木は必ずしも比較可能なデータを含む必要はありません。多くの(非検索)二分木が代数式を解析するために使用されます。二分木はノードと数値として演算子を配置することにより、インフィックス表記パーサーを書き込むのに最適です。葉のように
JBoy

2
@JBoy:その場合でも、それらはバイナリツリーにはなりません。(たとえば、単項演算子は2つの子を持つことはできません。)制約のない2進ツリーの実際の使用例は本当に考えられないので、そのようにコメントしました。
user541686 2015

2
素晴らしくてシンプル。視覚的な例の+1 :)
Andrei Konstantinov

@Mehrdadバイナリツリーには、ノードごとに1 つまたは2つの子があります。表現ツリーは完璧な例です。二分探索木はまた、唯一の要素の特定の番号に起こることができ、フルであることを起こる場合を除き、ノードごとに1つまたは2人の子供がいます。
ローン侯爵、2015年

56

Binary Treeは、2つの子(左側の子と右側の子)を持つツリーの特殊な形式です。それは単にツリー構造でのデータの表現です

二分探索木(BST)は、次の条件に従う特殊な二分木です。

  1. 左の子ノードはその親ノードよりも小さい
  2. 右の子ノードがその親ノードより大きい

23
これらの条件は十分ではありません。左のサブツリー全体には、親のキーよりも小さいキーが含まれていてはならず、右のサブツリー全体には、より大きいノードが含まれている必要があります。
ローン侯爵、2015年

1
@EJPコメントについて詳しく教えてください。サブツリー全体とはどういう意味ですか?あなたはサブツリーのすべての値が左側のルートよりも小さくなければならないことを意味しますか?そして、すべての値は右側のルート値よりも大きくなければなりませんか?
Asif Mushtaq

2番目のリンクに続いて、「検証」のセクションを読んでください。
Rob

38

バイナリツリーはノードで構成され、各ノードには「左」ポインタ、「右」ポインタ、およびデータ要素が含まれます。「ルート」ポインターは、ツリーの最上位ノードを指します。左と右のポインタは、どちらかの側の小さな「サブツリー」を再帰的に指します。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です。

問題の正確な表現に注意してください。「バイナリ検索ツリー」は「バイナリツリー」とは異なります。


@GabrielStaplesツリー構造を追加しました。
Gaurav Borole 2017

14

上記の誰もが二分木と二分探索木との違いについて説明したので、与えられた二分木が二分探索木であるかどうかをテストする方法を追加しています。

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);

}

それがあなたを助けることを願っています。ここで言及する価値があると感じたので、トピックから逸​​れてしまった場合は申し訳ありません。


1
左側または右側のサブツリーは空にすることができます。コードはそのケースを正しく処理しません。
ローン侯爵、2015年

11

バイナリツリーは、2つの子参照のみを持つことができるノードで構成されるデータ構造を表します。

一方、バイナリ検索ツリーBST)は、各ノードが同等の値を持ち、小さい値の子が左に接続され、大きい値の子が右に接続されているバイナリツリーデータ構造の特殊な形式です。

したがって、すべてのBSTバイナリツリーです。が、一部のバイナリツリーBSTになる場合があります。BSTBinary 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と呼ばれたのかがわかります。


Simple Binary Treeを実装できますか?利用可能な実装はありますか?このツリーの用途は何ですか?
Asif Mushtaq

@UnKnownバイナリ検索ツリーは、ソートと検索に使用できます。あなたはここでバイナリ検索ツリーの実装を見つけることができます:github.com/bzdgn/data-structures-in-java/blob/master/src/...
レベントDivilioglu

私はそれについて知っていますが、シンプルツリーまたはシンプルバイナリツリーの存在はありますか?またはシンプルバイナリツリーの実装?
Asif Mushtaq

これを使用する意味はありませんが、ルートと子に任意のNodeインスタンスを追加できます。
Levent Divilioglu

10

二分探索木は、次のプロパティを示す特殊な二分木です。任意のノードnについて、nの左側のサブツリー内のすべての子孫ノードの値はnの値よりも小さく、右側のサブツリー内のすべての子孫ノードの値はnの値より大きい。


8

二分木

バイナリツリーは、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版)から取得した画像


4

二分木は、子が2つを超えないツリーです。二分探索木は、左の子がルートノードのキーよりも小さい値を持ち、右の子がルートノードのキーよりも大きい値を持つべきであるという不変式に従います。


4
  • 二分探索木:二分木でインオーダートラバーサルが行われると、挿入された項目のソートされた値を取得します
  • 二分木:あらゆる種類のトラバーサルでソートされた順序が見つかりません

ソートされた順序を見つける必要はありません。二分探索木も二分木です。それらは相互に排他的ではありません。BSTはBTの適切なサブセットです。
ローン侯爵2015年

3

特定のバイナリツリーがバイナリ検索ツリーであるかどうかを確認するには、次の方法があります。

ツリーを順番にトラバースツリー(つまり、左の子->親->右の子)、トラバースしたノードのデータを一時変数に保存すると、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;
}

外部の一時変数を維持する


どちらのサブツリーもnullにすることができます。アルゴリズムはそのケースを正しく処理しません。
ローン侯爵、2015年

1

バイナリ検索ツリーでは、すべてのノードが特定の順序で配置されます。ルートノードの左側のノードはそのルートよりも小さい値を持ち、ノードの右側のすべてのノードはルート。


0

いずれかのノードの子の最大数が2である場合にのみ、ツリーをバイナリツリーとして呼び出すことができます。

いずれかのノードの子の最大数が2であり、左の子が常に右の子よりも小さい場合にのみ、ツリーをバイナリ検索ツリーとして呼び出すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.