ネット上で多くのことを探索しようとしましたが、助けを得ることができました。どこでも、バイナリ検索ツリーにノードを追加するようなものです。
質問:ノードをバイナリツリーに追加するためのアルゴリズムとコードスニペットを要求しています。 (または正しい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 );
}
}
バイナリツリーとバイナリ検索ツリーの違いは、どちらにも各ノードが最大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;
}
}
}
バイナリツリーではノードの順序が維持されないため、キューデータ構造を使用して要素をバイナリツリーに挿入できます。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;
}
}
私も同じ問題に直面しているので、ネット上で次の解決策を思いつきました:-
レベル順トラバーサルの場合と同様に、キューを使用して新しいノードを配置する現在のノードを格納し、レベルごとにノードを挿入できます。
次のリンクはあなたを助けるかもしれません:-
http://www.geeksforgeeks.org/linked-complete-binary-tree-its-creation/
コメントできないので、これを書いています。
二分木挿入関数に対する上記の答えは間違っています。
関数を挿入するために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になります。
コメントを投稿するのに必要な評判がないので、これを回答として投稿しています。 bagelboyを除いて、他のすべての人はツリーをバイナリ検索ツリーまたは完全なバイナリツリーのいずれかとして誤解しています。質問は単純な二分木であり、Bagelboyの答えは正しいように見えます。