数据结构删除父结点值为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