2017-01-30 59 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