//删除值为X的子树
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define Max 10
typedef struct treenode {
char data;
struct treenode* lchild, * rchild;
}treenode, * tree;
void creatTree(tree& t) {
char ch;
ch = getchar();
if (ch == '#') t = NULL;
else {
t = (treenode*)malloc(sizeof(treenode));
t->data = ch;
t->lchild = NULL;
t->rchild = NULL;
creatTree(t->lchild);
creatTree(t->rchild);
}
}
//进队出队判空判满
typedef struct queue1 {
struct treenode* data[Max];
int front;
int rear;
};
bool isqueueEmpty(queue1 q) {
if (q.front == q.rear)return true;
return false;
}
bool enterQu(queue1& q, treenode* p) {
if (q.front == (q.rear + 1) % Max)
return false;
q.rear = (q.rear + 1) % Max;
q.data[q.rear] = p;
return true;
}
bool outQu(queue1& q, treenode*& p) {
if (q.front == q.rear)
return false;
q.front = (q.front + 1) % Max;
p = q.data[q.front];
return true;
}
void InitQueue(queue1 &q) { //初始化队首、队尾指针
q.front = q.rear = 0;
}
void del_root(tree& t){//删除以x为根的树
if (t) {
del_root(t->lchild);
del_root(t->rchild);
free(t);
}
}
char del_X_root(tree& t,char c) {//算法
treenode* p;
queue1 q;
printf("1");
if (t->data == c)
return t->data;
InitQueue(q);
enterQu(q, t);
while (!isqueueEmpty(q)) {
outQu(q,p);
if(p->lchild){
if (p->lchild->data == c) {
del_root(p->lchild);
p->lchild = NULL;
}
else {
enterQu(q, p->lchild);
}
}
if (p->rchild) {
if (p->rchild->data == c) {
del_root(p->rchild);
p->rchild = NULL;
}
else {
enterQu(q, p->rchild);
}
}
}
printf("1");
}
void disp(tree t) {
if (t) {
printf("1");
printf("%c", t->data);
disp(t->lchild);
disp(t->rchild);
}
}
int main(){
tree t;
creatTree(t);
del_X_root(t, 'B');
disp(t);
return 0;
}
//ABD##E##CF##G##
0511删除值为X的子树
于 2022-11-10 18:35:09 首次发布