编写递归算法,对于二叉树中每一个元素值data
等于x
的节点,删去以它为根的子树,并释放相应的空间。
树的结构以广义表的形式给出。如A(B,)
表示一颗有2
个节点的树。其中根的data
值为A
,其左孩子为叶子节点,data
值为B
,右孩子为空。
输入有两行,第一行为以广义表的形式给出的树形结构,长度在区间 [0,30) 内,均由大写字母和左右括号组成,每个结点由一个大写字母组成,互不相同。第二行为待删除子树根结点的元素值x
,为一个大写字母。
输出有一行,为原树删除子树后的广义表达式。
若找不到该元素,则不做删除操作直接输出广义表达式。
A(B,C) B
A(,C)
Node *p = new Node(input[0]);
if (input[1] == '(') {
int comma_pos = input.find(',');
p -> lchild = build(input.substr(2, input.length() - 2));
2. 若有逗号,逗号在位置2上
p -> rchild = build(input.substr(3, input.length() - 2));
3. 若有逗号,逗号位置大于2
if (comma_pos > 2) { //有左子树
int i;
if (comma_pos == 3) { //左子树为叶子结点
p -> lchild = new Node(input[2]);
i = 2;
} else if (comma_pos > 3) { //有左子树
int comma = 1;
i = comma_pos;
while(comma > 0) {
i++;
if (input[i] == ',') {
comma++;
} else if (input[i] == ')') {
comma--;
}
}
p -> lchild = build(input.substr(2, i));
}
if (isupper(input[i + 2])) { //也有右子树时,无则忽略该步
p -> rchild = build(input.substr(i + 2));
}
}
A
可见广义表为空,要删除结点A。正确输出应该为空。
A
这个应该考察了scanf,cin等等的用法。
#include
#include
#include
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::scanf;
class Node{
public:
char data;
Node *lchild, *rchild;
Node(char _data) {
data = _data;
lchild = NULL;
rchild = NULL;
}
~Node() {
if (lchild != NULL) {
delete lchild;
}
if (rchild != NULL) {
delete rchild;
}
}
Node* build (const string input) {
Node *p = new Node(input[0]);
if (input[1] == '(') {
int comma_pos = input.find(',');
if (comma_pos > 2) { //有左子树
int i;
if (comma_pos == 3) { //左子树为叶子结点
p -> lchild = new Node(input[2]);
i = 2;
} else if (comma_pos > 3) { //有左子树
int comma = 1;
i = comma_pos;
while(comma > 0) {
i++;
if (input[i] == ',') {
comma++;
} else if (input[i] == ')') {
comma--;
}
}
p -> lchild = build(input.substr(2, i));
}
if (isupper(input[i + 2])) { //也有右子树时,无则忽略该步
p -> rchild = build(input.substr(i + 2));
}
} else if (comma_pos == 2) { //只有右子树
if (input[4] == '(') {
int left = 1;
int i = 2;
while(left > 0) {
i++;
if (input[i] == '(') {
left++;
} else if (input[i] == ')') {
left--;
}
}
p -> rchild = build(input.substr(3, i - 3));
} else {
p -> rchild = new Node(input[3]);
}
}
}
return p;
}
void delete_char(char x) {
if (lchild != NULL) {
if (lchild -> data == x) {
lchild = NULL;
} else {
lchild -> delete_char(x);
}
}
if (rchild != NULL) {
if (rchild -> data == x) {
rchild = NULL;
} else {
rchild -> delete_char(x);
}
}
}
void output() {
if (data != NULL) {
cout << data;
if (lchild != NULL || rchild != NULL) {
cout << "(";
if (lchild != NULL) {
lchild -> output();
}
if (rchild != NULL) {
cout << ",";
rchild -> output();
}
cout << ")";
}
}
}
};
class BinaryTree{
private:
Node *root;
public:
BinaryTree() {
root = NULL;
}
~BinaryTree() {
delete root;
}
void build (const string input) {
root = root -> build (input);
}
void delete_char(char x) {
if (root -> data == x) {
root = NULL;
} else {
root -> delete_char(x);
}
}
void output() {
if (root != NULL) {
root -> output();
}
}
};
int main() {
BinaryTree binarytree;
char input[31];
char input_x = '0';
scanf("%s\n%c", input, &input_x);
if (input_x != '0') {
binarytree.build(input);
binarytree.delete_char(input_x);
binarytree.output();
}
return 0;
}