2013-08-27 100 views
0

嘿,我想從我的二叉樹中刪除一個節點。我知道一個節點不能被刪除,如果它有左右兩邊的孩子。所以我寫了相應的代碼。但每次程序運行時,都會崩潰。二叉樹刪除函數錯誤

void btdel(btree *b, char d) 
{ 
    if (b->lchild->data!=d&&b->lchild!=NULL) 
    btdel(b->lchild,d); 
    if (b->rchild->data!=d&&b->rchild!=NULL) 
    btdel(b->rchild,d); 
    if (b->lchild!=NULL&&b->lchild->data==d) 
    { 
     if (b->lchild->rchild==NULL) 
      b->lchild=b->lchild->lchild; 
     else if (b->lchild->lchild==NULL) 
      b->lchild=b->lchild->rchild; 
      else {cout<<"cannot delete"; exit(1); 
      } 
    } 
    else if (b->rchild!=NULL&&b->rchild->data==d) 
    { 
     if (b->rchild->rchild==NULL) 
      b->rchild=b->rchild->lchild; 
     else if (b->rchild->lchild==NULL) 
      b->rchild=b->rchild->rchild; 
     else 
     {cout<<"Cannot delete. "; exit(1);} 
    } 
} 
+0

它會在哪條線上崩潰? – Borgleader

+0

不妨檢查一下b!= NULL。 – Andy

回答

2

快看:

if (b->lchild->data!=d && b->lchild!=NULL) 

應該是:

if (b->lchild!=NULL && b->lchild->data!=d) 

你需要檢查b->lchild它是否讀取其數據之前有一個有效的地址。

+1

對於'b-> rchild',同樣的問題有幾行下來btw。 –