考研数据结构(每日一题)
题目:已知二叉树以二叉链表存储,编写算法完成:对于树中每个元素值为x的结点,删去以它为根的子树,并释放相应的空间。
算法思想:
- 采用递归
- 后序遍历。删除值为x的结点,将其父节点的左(右)子树指针置空,用层次遍历找到某结点的父节点
完整代码:
//递归
void Del_all(BiTree &T,char x){
if(T == NULL){
return;
}
if(T -> data == x){
Del_x(T);
T = NULL;
return;
}
Del_all(T -> lchild,x);
Del_all(T -> rchild,x);
}
//在二叉树上查找所有以x为元素的结点,并删除以其为根的子树
void Search(BiTree bt,Elemtype x){
BiTree Q[]; //Q是存放二叉树结点指针的队列,容量要足够大
if(bt){
if(bt -> data == x){ //若根结点值为x,则删除整棵树
DeleteXTree(bt);
exit(0);
}
InitQueue(Q);
EnQueue(Q,bt);
while(!IsEmpty(Q)){
DeQueue(Q,p);
if(p -> lchild){ //若左子女非空
if(p -> lchild -> data == x){ //左子女符合删除左子树
DeleteXTree(p -> lchild);
p -> lchild = NULL;
}else{ //父结点的左子女置空
EnQueue(Q,p -> lchild); //左子树入队
}
}
if(p -> rchild){ //若右子女非空
if(p -> rchild -> data == x){ //右子女符合删除右子树
DeleteXTree(p -> rchild);
p -> rchild = NULL;
}else{
EnQueue(Q,p -> rchild); //右子树入队
}
}
}
}
}