問題:對於樹中每個元素值為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 }