-1

这是想法,

这不是二叉树,实际上我可以在树的左侧或右侧插入一个节点,这就是这个。

左 - 右节点

所以,我想要的是在节点左侧插入 5 作为值:节点下方的新节点以 5 作为值,新节点值 13

节点下方的新节点,值为 5,新节点值为 13

问题是当我尝试在节点处插入 10 作为值时,不起作用。更新:不插入节点,不崩溃,不错误

这是代码。

struct bin_tree {
int data;
struct bin_tree * right;
struct bin_tree * left;
};

typedef struct bin_tree node;


enum Ruta{
    LEFT,
    RIGHT
};



void insertSide(node ** tree, int val, Ruta r)
{
    node *temp = NULL;

    if(!(*tree))
    {
        temp = new node();
        temp->left = temp->right = NULL;
        temp->data = val;
        *tree = temp;
        return;
    }

    if(r == LEFT)
    {
        if ( &(*tree)->left == NULL)
        {insert(&(*tree)->left, val);}
        else{insertSide(&((*tree)->left),val,r);}
    }
    else
    {
        if ( &(*tree)->right == NULL)
        {insert(&(*tree)->right, val);}
        else{insertSide(&((*tree)->right),val,r);}
    }
}


node * searchDeep(node ** tree,int valSearch,bool & f)
{
    node * temp;

    if((*tree))
    {
    if(valSearch == (*tree)->data)
    {
        f = true;
        temp = new node();
        temp->left = temp->right = NULL;
        temp->left = (*tree)->left;
        temp->right = (*tree)->right;
        temp->data = (*tree)->data;
        *tree = temp;
        return *tree;
    }
    if (f == false){
        searchDeep(&((*tree)->left), valSearch,f);
        searchDeep(&((*tree)->right), valSearch,f);
    }

    }

}

void insertAt(node ** tree, int valSearch,int valNew,Ruta r)
{
    node * temp;
    bool f;
    f =false;
    temp = searchDeep(tree,valSearch,f);
    insertSide(&temp,valNew,r);
}

int main()
{
    node *root;
    node *tmp;

    insertSide(&root,9,LEFT);
    insertSide(&root,5,RIGHT);
    insertSide(&root,10,LEFT);
    insertSide(&root,25,LEFT);
    insertSide(&root,45,LEFT);
    insertSide(&root,3,RIGHT);

    insertAt(&root,5,13,LEFT);
    //this does not work
    //insertAt(&root,10,9,RIGHT);

    return 0;
}

更新:

对不起,这里是插入代码

void insert(node ** tree, int val)
{
    node *temp = NULL;
    if(!(*tree))
    {
        temp = new node();
        temp->left = temp->right = NULL;
        temp->data = val;
        *tree = temp;
        return;
    }

    if(val < (*tree)->data)
    {
        insert(&(*tree)->left, val);
    }
    else if(val > (*tree)->data)
    {
        insert(&(*tree)->right, val);
    }

}
4

2 回答 2

0

您的部分问题是这个测试:

if ( &(*tree)->left == NULL)

这与以下内容相同:

if ( &((**tree).left) == NULL)

它总是评估为真,因为 left 的地址永远不能为空。我建议更改代码以通过 C++ 样式引用而不是指针传递。这将使它不那么混乱。

以下是有关参考的一些信息:

http://www.cprogramming.com/tutorial/references.html

于 2013-04-27T02:54:43.603 回答
0

searchDeep。如果它被调用f == false(它总是如此),则没有返回语句。因此,这种情况下的返回值不可能是有效的node*。调用insertAt保留此值,然后取消引用它,这将(通常)是未定义的行为。

当一个非空函数可以在没有return语句的情况下结束时,一个好的编译器会警告你。

于 2013-04-27T03:31:00.783 回答