數據結構刪除父結點值為x的子樹


問題:對於樹中每個元素值為x的結點,刪除以它為根的子樹,並釋放相應空間。

算法思想:刪除值為x的結點,意味着將其父節點的左(右)子女指針置空,用層次遍歷易於找到某節點的父節點。本題要求元素值為x的結點的子樹,因此要遍歷完整顆二叉樹。

代碼如下:

 1 //刪除結點值為x的子樹,同時釋放相應空間
 2 void DeleteTree(BiTree &bt)    //刪除以bt為根的子樹
 3 {  4     if(bt)  5  {  6         DeleteTree(bt->lchild);  7         DeleteTree(bt->rchild);  8         free(bt);      //釋放被刪結點所占的存儲空間
 9  } 10 } 11 void Search(BiTree bt,ElemType x)   //在二叉樹上查找以x為元素值的結點,並刪除以根為結點的子樹
12 { 13     BiTree Q[];       //存放二叉樹結點指針的隊列
14     if(bt) 15  { 16         if(bt->data==x)    //根節點值為x,則刪除整棵樹
17  { 18  DeleteTree(bt); 19             exit(0); 20  } 21  InitQueue(Q); 22  EnQueue(bt); 23         while(!IsEmpty(Q)) 24  { 25  DeQueue(Q,p); 26             if(p->lchild)    //若左子樹非空
27  { 28                 if(p->lchild->data==x)   //左子樹元素值滿足刪除條件
29  { 30                     DeleteTree(p->lchild); 31                     p->lchild==null;  //父節點的左子女設置為空
32  } 33                 else
34                     EnQueue(Q,p->lchild);   //將左孩子入隊
35  } 36             if(p->rchild)    //若右子樹非空
37  { 38                 if(p->rchild->data==x)   //右子樹元素值滿足刪除條件
39  { 40                     DeleteTree(p->rchild); 41                     p->rchild==null;   //父節點的右子女設置為空
42  } 43                 else
44                     EnQueue(Q,p->rchild);   //將右孩子入隊
45  } 46  } 47          
48  } 49         
50 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM