该题目的思路在于层序遍历,即层次遍历树的每一个节点,如果该节点非空且其值等于目标值,就将其删除,但是需要额外注意的是,释放该节点后,需要将其父节点指向该节点的指针设为空,具体代码实现如下:
第一部分:通过递归的方式释放节点资源
void deleteXTree(Bitree& T) {
if (T) {
deleteXTree(T->lchild);
deleteXTree(T->rchild);
free(T);
}
}
第二部分:基于层次遍历实现查找目标节点
void Search(Bitree T, ElemType x) {
QueueNode Q;
initQueue(Q);
Bitree p = NULL;
if (T) {
if (T->data == x) {
deleteXTree(T);
exit(0);
}
}
EnQueue(Q, T);
while (!isEmptyQueue(Q)) {
p = 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);
}
}
}
}