web-dev-qa-db-ja.com

二分木に要素を挿入する

ネット上で多くのことを探索しようとしましたが、助けを得ることができました。どこでも、バイナリ検索ツリーにノードを追加するようなものです。

質問:ノードをバイナリツリーに追加するためのアルゴリズムとコードスニペットを要求しています。 (または正しいURLを教えてください)

仮定:私の理解によると、二分木二分探索木は異なりますか?私が間違っている場合は私を訂正してください。

(リクエスト:コードスニペットを作成している場合は、理解に役立つ適切な変数名を使用してください)

例:二分木

5 7 3 x1 x2 x3

                 5

          7               3

   x1       x2       x3       

二分探索木57 3 2 4 6

                   5
          3               7

   2          4       6       





insert(int key, struct node **root)
{
    if( NULL == *root )`
    {
        *root = (struct node*) malloc( sizeof( struct node ) );`
        (*root)->data = key;
        (*root)->left = NULL;    
        (*root)->right = NULL;  
    }
    else if(key < (*root)->data)
    {
        insert( key, &(*root)->left );
    }
    else if(key > (*root)->data)
    {
        insert( key, &(*root)->right );
    }
}
10
Raa

バイナリツリーとバイナリ検索ツリーの違いは、どちらにも各ノードが最大2つの子ノードを持つことができるという制限がありますが、バイナリ検索ツリー(BST)でも、左側の子の値が同じかそれ以下である必要があることです。その右の子は、それ以上の値でなければなりません。これが、すべてが番号順に並べられ、検索の実行時間がO(logn)であるため、「検索」ツリーと呼ばれる理由です。

BSTである必要がないため、バイナリツリーをベクトル(配列)に格納できます。ベクトルに挿入すると、レベル順でバイナリツリーが構築されます。コードは以下のとおりです。

// typedef the node struct to NODE
// nodeVector similar to STL's vector class
insert(int key, NODE** nodeVector)
{
    NODE *newNode = (NODE*) malloc( sizeof( NODE ) );
    newNode->data = key;
    newNode->left = NULL;    
    newNode->right = NULL;

    // add newNode to end of vector
    int size = nodeVector->size();
    nodeVector->Push_back(newNode);

    // if newNode is not root node
    if(nodeVector->size() > 1)
    {
        // set parent's child values
        Node* parent = (size/2)-1; // take advantage of integer division instead of using floor()
        if (parent->left == NULL)
        {
            parent->left = newNode;
        }
        else
        {
            parent->right = newNode;
        }
    }
}
7
sbru

バイナリツリーではノードの順序が維持されないため、キューデータ構造を使用して要素をバイナリツリーに挿入できます。nullが見つかったらすぐにノードを挿入します。キューを使用して、レベル順トラバーサルでバイナリツリーをトラバースします。

struct Treenode* temp;

Q = CreateQueue();
EnQueue(Q,root);

while(!IsEmptyQueue(Q))
{
    temp = DeQueue(Q);
    if(temp->left)
        EnQueue(Q,temp->left);
    else
    {
        temp->left=newNode;
        DeleteQueue(Q);
        return;
     }
     if(temp->right)
        EnQueue(Q,temp->right);
    else
    {
        temp->right=newNode;
        DeleteQueue(Q);
        return;
     }
}
2
user905

私も同じ問題に直面しているので、ネット上で次の解決策を思いつきました:-

レベル順トラバーサルの場合と同様に、キューを使用して新しいノードを配置する現在のノードを格納し、レベルごとにノードを挿入できます。

次のリンクはあなたを助けるかもしれません:-

http://www.geeksforgeeks.org/linked-complete-binary-tree-its-creation/

0
anonymous

コメントできないので、これを書いています。
二分木挿入関数に対する上記の答えは間違っています。
関数を挿入するために0、1、2、3、4、5が順番に渡されたとします。
その生成ツリーのような

       0
      /
     1
      \ 
       2
      /
     3
      \
       4
      /
     5`<br/>

そのうちの順序トラバーサルは13 5 4 20になります
答えは

                     0
                   /  \
                  1    2 
                 / \  /  
                3   4 5


この順序の走査は31 4 0 52になります。

0
codeFreak

コメントを投稿するのに必要な評判がないので、これを回答として投稿しています。 bagelboyを除いて、他のすべての人はツリーをバイナリ検索ツリーまたは完全なバイナリツリーのいずれかとして誤解しています。質問は単純な二分木であり、Bagelboyの答えは正しいように見えます。

0
takesavy