2013-04-27 96 views
-1

这里是想,树,插入节点在特定点

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

Left - Right Nodes

所以,我想是在节点的左边有5插入的值:以下节点 新节点,5为价值,新的节点值13

New node below node with 5 as value , new node value 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; 
} 

UPDATE:

对不起这里的插入代码

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); 
    } 

} 
+0

你是什么意思,“不起作用”。它没有正确插入吗?它会崩溃吗?是否有编译器错误? – Xymostech 2013-04-27 02:05:32

+0

没有错误,没有崩溃,没有插入节点, – Crashman 2013-04-27 02:15:58

+0

'insert'定义在哪里? – Beta 2013-04-27 02:30:40

回答

0

你的问题的部分原因是本次测试:

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

这是一样的:

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

它总是评估为真,因为左侧的地址永远不能为空。我建议更改代码以传递C++样式引用而不是指针。这会使它不那么令人困惑。

下面是关于引用的一些信息:

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

+0

我认为你需要用调试器遍历你的代码,这样你才能看到发生了什么。仅仅因为代码有效并不意味着它总能正常工作。例如,searchDeep在某些情况下不会返回任何内容。 – dwMagician 2013-04-27 03:17:02

0

searchDeep。如果用f == false(它总是)调用它,则不存在返回语句。所以在这种情况下的返回值不可能是有效的node*insertAt中的调用保留此值,然后将其解除引用,这将(通常)是未定义的行为。

一个好的编译器会在没有return语句的情况下结束非void函数时发出警告。