首先递归创建一颗二叉树
根据输入的节点值创建二叉树根据用户输入的节点值(-1表示空节点),使用递归的方式创建二叉树。
查找要删除的子树的根节点
用户输入要删除的子树的根节点的值,程序在二叉树中查找值为该值的节点,并返回该节点的指针。
递归删除子树
对于当前节点,依次递归删除其左子树和右子树中值为子树根节点值的子树。如果当前节点为空或者当前节点的值不等于子树根节点的值,则直接返回当前节点的指针。如果当前节点的左子树或右子树中存在值为子树根节点的节点,则将该节点的左子树或右子树置为空,并释放该节点的空间。
输出删除子树后的二叉树
使用中序遍历的方式遍历二叉树,输出删除子树后的节点值序列。
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树
struct TreeNode
{
int val; //节点的值
struct TreeNode *left ; //指向左节点的指针left
struct TreeNode *right; //指向右节点的指针right
};
//创建一颗二叉树,定义递归函数creat_tree
struct TreeNode *create_tree(){
int val;
scanf("%d",&val); //输入节点的值
if (val == -1){
//如果输入的是-1,表示当前的结点为空
return NULL;
}
//创建新的结点
struct TreeNode *root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->val = val;
root->left = create_tree(); //创建左子树
root->right = create_tree(); //创建右子树
}
//查找根节点为x的子树
struct TreeNode *find_subtree(struct TreeNode *root,int x){
if(!root){
//如果是空树则直接返回
return NULL;
}
if(root->val ==x){
//如果当前节点的值为x,返回当前节点
return root;
}
//在左子树中查找
struct TreeNode *left = find_subtree(root->left,x);
if(left){
//如果找到了,返回左子树中的节点
return left;
}
//继续在右子树中查找
return find_subtree(root->right,x);
}
//删除根节点为x的子树
struct TreeNode *delete_subtree(struct TreeNode *root,int x){
if(!root){
//如果是空树,直接返回
return NULL;
}
if(root->val==x){
//如果当前节点的值为x,删除该子树并返回为空
root ->left =NULL;
root->right=NULL;
return NULL;
}
//递归删除右子树中节点值为x的子树
root->left = delete_subtree(root->left,x);
// 递归删除右子树中节点值为x的子树
root->right = delete_subtree(root->right, x);
return root;
}
//中序遍历二叉树
void inorder_traversal(struct TreeNode *root){
if(!root){
//如果是空树直接返回
return;
}
inorder_traversal(root->left); //遍历左子树
printf("%d ",root->val);
inorder_traversal(root->right);//遍历右子树
}
int main(){
//创建一颗二叉树
struct TreeNode *root = create_tree();
printf("中序遍历二叉树:");
inorder_traversal(root);
int x;
printf("\n请输入你要删除节点的值:");
scanf("%d",&x);
//查找根节点为x的子树
struct TreeNode *subtree = find_subtree(root,x);
if(subtree){
//如果找到了
root = delete_subtree(root,x); //删除
}
//中序遍历二叉树
inorder_traversal(root);
return 0;
}