删除二叉树的子树:递归算法删除根结点值为x的子树

  1. 首先递归创建一颗二叉树

根据输入的节点值创建二叉树根据用户输入的节点值(-1表示空节点),使用递归的方式创建二叉树。

  1. 查找要删除的子树的根节点

用户输入要删除的子树的根节点的值,程序在二叉树中查找值为该值的节点,并返回该节点的指针。

  1. 递归删除子树

对于当前节点,依次递归删除其左子树和右子树中值为子树根节点值的子树。如果当前节点为空或者当前节点的值不等于子树根节点的值,则直接返回当前节点的指针。如果当前节点的左子树或右子树中存在值为子树根节点的节点,则将该节点的左子树或右子树置为空,并释放该节点的空间。

  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;
}
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值