私にはわかりません。そして、実際には私はこれについてのチュートリアルを見つけることができないと思っています。これはアルゴリスム関連の質問にもっと似ています。 CLRを思い出す限り、1はこのトピックを少し扱いました。
これは、このようなツリーの場合、addがどのように見えるかの例です。しかし、私はCLRがそれをコードのいくつかの行で例証できるよりもうまくカバーしていると思います。
int add(node **root, int value)
{
node *var,*parent_node;
var = malloc(sizeof(node));
var->data = value;
/* if the tree hasn't been initialised we do so now */
if (*root == NULL)
{
var->parent = NULL;
var->left = NULL;
var->right = NULL;
return 0;
}
/* we look for the future parent of our new node */
parent_node = search(*root,value);
/* if the value already exists we return -1 */
if (parent_node->data == value)
return 0;
var->parent = parent_node;
/* put the new node into position */
if (parent_node->data > value)
parent_node->left = var;
else
parent_node->right = var;
return 0;
}
この検索機能は、検索時に親が入っていないため、バイナリツリーのテキスト検索機能です。値が見つからない場合は平均検索でNULLが返されるため、NULLの「親」を返すように修正することをお勧めします。次のようなもの:
node *search(node *root, int value)
{
node *var, *cursor;
cursor = root;
while(cursor->data != value)
{
if (cursor->data > value)
var = cursor->left;
else
var = cursor->right;
if (var == NULL)
return cursor;
cursor = var;
}
return cursor;
}
具体的には何を学びたいですか?これはどのような種類のツリーです(一般的なバイナリツリー?赤/黒ですか?) – templatetypedef
たとえば、左ノードを持たないノードはどうでしょうか?または親ですか? –
バイナリツリーです。目的は親の値が何であるかをテストすることです。したがって、ノードの構造に* parentを追加する必要があります。私はそれをした、私はセグメント違反がある、私は本当に理解していないと思うと私はチュートリアルが必要です。 – lilawood