2017-01-30 94 views
0

我的解决办法是像我的二叉树插入逻辑的缺陷在哪里?

/* 
Node is defined as 

typedef struct node 
{ 
    int data; 
    node * left; 
    node * right; 
}node; 

*/ 


node * insert (node * root, int value) 
{ 
    bool inTreeAlready = false; 
    node * cur = root; 
    while(cur != NULL) 
    { 
     if(cur->data < value) 
      cur = cur->right; 
     else if(cur->data > value) 
      cur = cur->left; 
     else 
     { 
      inTreeAlready = true; 
      break; 
     } 
    } 
    if(!inTreeAlready) 
    { 
     cur = new node; 
     cur->data = value; 
     cur->left = NULL; 
     cur->right = NULL; 
    } 
    return root; 
} 

其中提示的问题说你应该插入后返回树的根。

这显然错了,因为输出是

Wrong Answer! 
Some possible errors: 
1. You returned a NULL value from the function. 
2. There is a problem with your logic 
3. You are printing some value from the function 

这是不是很描述。

我仔细检查了我的逻辑,不知道交易是什么。

+1

我看到你创建一个新的节点,但我没有看到你实际将它链接到树上。它不能从'root'获得 - 它只是被泄露。如果你从一棵空树('root == NULL')开始,你也清楚地以一棵空树结尾('root'仍然是'NULL') - 所以你永远不会得到第一个节点。 –

+0

奇怪的是这段代码打印了一些东西,因为它没有任何'printf'调用。 – immibis

回答

0

您没有将新节点添加到树中。这是一个修改后的版本。

node * insert (node * root, int value) 
{ 
    bool inTreeAlready = false; 
    node * cur = root; 
    node *parent; 
    bool right; 
    while(cur != NULL) 
    { 
     parent = cur; 
     if(cur->data < value) 
     { 
      cur = cur->right; 
      right = true; 
     } 
     else if(cur->data > value) 
     { 
      cur = cur->left; 
      right = false; 
     } 
     else 
     { 
      inTreeAlready = true; 
      break; 
     } 
    } 
    if(!inTreeAlready) 
    { 
     cur = new node; 
     cur->data = value; 
     cur->left = NULL; 
     cur->right = NULL; 
     if(root == NULL) root = cur; 
     else if(right) parent->right = cur; 
     else parent->left = cur; 
    } 
    return root; 
} 
+0

并认为我可以在C#中用5-7行完成整个事情。喜欢C++。 – user7127000

+0

@ user7127000在“5-7行”中做什么?无论使用哪种语言,您在代码中的问题都是您完全忽略了将新节点与树结合在一起。没有语言会神奇地使节点成为没有代码的树的一部分。 – PaulMcKenzie

+0

@ user7127000我可以让它成为一行(当然有几个分号)。 ;-) 开玩笑。我同意一项任务似乎对一种语言如此复杂,但对另一种语言来说可能很简单。 – Shiping