【问题描述】编写递归算法,对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。 先序序列构造二叉树,结点数据类型为字符型,空结点用'#'表示。 输入要删除的结点值。 ABC##D##C#F## C 【样例输出】 ABD |
#include <stdio.h>
#include <stdlib.h>
struct Node {
char value;
struct Node* left;
struct Node* right;
};
struct Node* constructTree(char* preorder, int* index) {
if (preorder[*index] == '#') {
(*index)++;
return NULL;
}
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->value = preorder[*index];
(*index)++;
node->left = constructTree(preorder, index);
node->right = constructTree(preorder, index);
return node;
}
void deleteSubtree(struct Node* node, char target) {
if (node == NULL) {
return;
}
if (node->left && node->left->value == target) {
free(node->left);
node->left = NULL;
}
if (node->right && node->right->value == target) {
free(node->right);
node->right = NULL;
}
deleteSubtree(node->left, target);
deleteSubtree(node->right, target);
}
void preorderTraversal(struct Node* node) {
if (node == NULL) {
return;
}
printf("%c", node->value);
preorderTraversal(node->left);
preorderTraversal(node->right);
}
int main() {
char preorder[100];
scanf("%s", preorder);
char target;
scanf(" %c", &target);
int index = 0;
struct Node* root = constructTree(preorder, &index);
deleteSubtree(root, target);
preorderTraversal(root);
return 0;
}