我试图在bst中使用while循环插入节点,但它不起作用

时间:2015-08-22 07:57:34

标签: c algorithm binary-search-tree

这是插入节点的功能 但root没有更新

Node *insert(Node **root,int data) {
    Node *k = *root;

    if (*root==NULL) {
        *root = createNode(data);
        return *root;
    }
    else {
        while (*root) {
            // printf("%d", (*root)->data);
            if (data < (*root)->data) {
                *root = (*root)->left;
            } else {
                *root = (*root)->right;
            }
        }

        *root = createNode(data);
        return k;
    }
}

这是插入节点的功能 但root没有更新

1 个答案:

答案 0 :(得分:4)

你没有正确地向下推进root

此:

if(data < (*root)->data){
    *root = (*root)->left;
}else{
    *root = (*root)->right;
}

应该是这样的:

if(data < (*root)->data){
    root = &(*root)->left;
}else{
    root = &(*root)->right;
}

指向指针root的目的是保存指针的地址,该指针最终将被更新以保存指向新节点的指针。当您沿树走下去时,应更新root以保存下一个潜在候选指针的地址。最终,您将到达一个NULL指针,因此是您将挂起新节点的候选者。

并且fwiw,这里对NULL的初始测试:

if(*root==NULL){
    *root = createNode(data);
    return *root;
}else{

毫无意义,保存k是错误的。固定和缩小,应该是:

Node *insert(Node **root,int data)
{
    Node **k = root;

    while (*root)
    {
        if (data < (*root)->data)
            root = &(*root)->left;
        else
            root = &(*root)->right;

    }
    *root = createNode(data);
    return *k;
}