/*
输入样例:
1
124###3##
2
124###3##
2
123##4##537##8###
*/
#include <bits/stdc++.h>
using namespace std;
typedef struct node {
char data;
struct node *lchild;
struct node *rchild;
} *Bitree;
char ch;
Bitree root, pre;
Bitree CreateBitree() {
cin >> ch;
Bitree T;
T = new node;
if(ch == '#') T = NULL;
//注意:二叉树的输入需要严格遵守以#结尾的规则,并且输入顺序按照前序遍历的方式
else {
T->data = ch;
T->lchild = CreateBitree();
T->rchild = CreateBitree();
}
return T;
}
void Remove(Bitree T) {//删除以T为根节点的树
if(T) {
Remove(T->lchild);
Remove(T->rchild);
}
delete T;//delete删除的是T指向的空间,而不是T本身
}
void print(Bitree T) {//前序遍历打印
if(T) {
cout << T->data << " ";
print(T->lchild);
print(T->rchild);
}
}
void Pre(Bitree T, char x, Bitree pre) {
if(T) {
if(T->data == x && T != root) { //如果删除的不是根节点
if(pre->lchild == T) pre->lchild = NULL;//防止删除节点的父节点的指针悬空
else if(pre->rchild == T) pre->rchild = NULL;
Remove(T);
return;
}
else if(T->data==x)Remove(T);
Pre(T->lchild, x, T);
Pre(T->rchild, x, T);
}
}
char dele;
int main() {
cin >> dele;//输入要删除的数值
root = CreateBitree();//建树
print(root);//前序遍历打印树
// pre = NULL;
Pre(root, dele, root);//进行删除操作,输入分别代表根节点,要删除的数值,当前节点的父节点
printf("\n________\n\n");
if(dele==root->data) printf("NULL\n");//如果当前删除的是根节点那么输出NULL
else print(root);//如果不是根节点,就按照前序遍历输出这棵树
return 0;
}
对于树中每一个元素值为x的结点,删去以它为根的子树
猜你喜欢
转载自blog.csdn.net/yiqzq/article/details/80271185
今日推荐
周排行