问题:对于树中每个元素值为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 }