2014-11-22 118 views
0

我想從二叉搜索樹中刪除節點。在這個功能中有3個參數。其中之一是樹,其他是開始節點和結束節點。我想刪除開始節點和結束節點之間的節點。 P.S:用戶寫入起始節點和結束節點,我們將它們用作參數。刪除二進制搜索樹中的節點C

這是我寫的代碼:

node * removeReviewsBetween(node * tree,double start,double end){ 
    node * newNode; 
    if(tree==NULL){ 
     return NULL; 
    } 


    if(start< tree->scoreNumber){ 
     tree->left=removeReviewsBetween(tree->left,start,end); 
    } 

    else if(start > tree->scoreNumber){ 
     tree->right=removeReviewsBetween(tree->right,start,end); 
    } 

    else{ 
     if(tree->right && tree->left){ 
      newNode=findMin(tree->right); 
      tree->scoreNumber=newNode->scoreNumber; 
      tree->right=removeReviewsBetween(tree->left,tree->scoreNumber,end); 
     } 

     else{ 
      newNode=tree; 
      if(tree->left==NULL){ 
       tree=tree->right; 
      } 
      else if(tree->right==NULL){ 
       tree=tree->left; 
      } 
      free(newNode); 
     } 

     return tree; 
    } 
} 

我寫成才,但它正確好好嘗試的工作。請給我一些建議

+0

請告訴我們究竟是行不通的。也向我們展示你的節點struct – 2014-11-22 15:16:22

+0

@PhilippMurry它不檢查樹是否有開始和結束節點。 – user3142663 2014-11-22 17:10:27

回答

0

應該這樣做 - 你的代碼稍加修改:

node *removeReviewsBetween(node *tree, double start, double end){ 
    node *newNode; 
    double score; 

    if(tree==NULL){ 
     return NULL; 
    } 

    while (tree->scoreNumber >= start && tree->scoreNumber =< end){ // if head is in the range to delete 
     if(tree->right){ 
      newNode = findMin(tree->right); 
      score = newNode->scoreNumber; 
      removeReviewsBetween(tree, score, score); 
      tree->scoreNumber = score; 
      continue; 
     } 

     if(tree->left){ 
      newNode = findMax(tree->left); 
      score = newNode->scoreNumber; 
      removeReviewsBetween(tree, score, score); 
      tree->scoreNumber = score; 
      continue; 
     } 

     return NULL; // if the only node left is the head and it's still in the range to delete 
    } 

    if(end < tree->scoreNumber){ // if all nodes to delete are in the left subtree 
     tree->left = removeReviewsBetween(tree->left, start, end); 
     return tree; 
    } 

    else if(start > tree->scoreNumber){ // if all nodes to delete are in the right subtree 
     tree->right = removeReviewsBetween(tree->right, start, end); 
     return tree; 
    }   
} 
+0

謝謝你它正常工作,但有一些問題,我不解決它。例如,我的s​​coreNumbers在1和10之間,當用戶寫入start = 0和end = 11時,它會刪除所有樹,但是這些數字不在該範圍內。 @striving_coder – user3142663 2014-11-22 16:37:21

+0

@ user3142663:你是什麼意思,他們不在範圍內?可能是我們正在通過對方說話,但是對於當用戶使用範圍參數'start = 0'和'end = 11'提交命令時,意味着「刪除所有包含0到11之間的值的節點」,並且如果樹中的所有節點都在1到10之間,樹的所有節點落在指定範圍內,因此整個樹將被刪除。如果這不符合你的要求,你需要重新指定你的目標。 – 2014-11-27 02:26:18