给定值删除二叉树中的节点(C语言)

#include<stdio.h>
#include<stdlib.h>
struct TreeNode{
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
};
struct TreeNode *findMin(struct TreeNode *T){
    if(T==NULL){
        return NULL;
    }
    if(T->left==NULL){/*对于有序二叉树最左边的节点值最小*/
        return T;
    }
    return findMin(T->left);
}
struct TreeNode *deleteNode(struct TreeNode *T,int num){/*删除操作的核心代码*/
    if(T==NULL){
        return NULL;
    }
    if(T->data>num){
        T->left=deleteNode(T->left,num);
    }else if(T->data<num){
        T->right=deleteNode(T->right,num);
    }else if(T->left!=NULL&&T->right!=NULL){
        struct TreeNode *min=findMin(T);
        T->data=min->data;/*左右都不空就到找到右边最小节点,替换该节点*/
        T->right=deleteNode(T->right,min->data);/*然后在右子树中删除该最小节点*/
    }else{
        struct TreeNode *temp;
        temp=T;
        if(T->left==NULL){/*左空接右边*/
            T=T->right;
        }else if(T->right==NULL){/*右空接左边*/
            T=T->left;
        }
        free(temp);
    }
    return T;
}
struct TreeNode *createNode(int num){/*创建新的树节点*/
    struct TreeNode *T;
    T=(struct TreeNode *)malloc(sizeof(struct TreeNode));
    T->data=num;
    T->left=NULL;
    T->right=NULL;
    return T;
}
struct TreeNode *add(struct TreeNode *T,int num){/*向树中加元素*/
    if(T==NULL){
        return createNode(num);
    }
    if(num<T->data){
        T->left=add(T->left,num);
    }else if(num>T->data){
        T->right=add(T->right,num);
    }
    /*剩余一种情况为num和T->data相等,不作处理,这里构造的是没有重复元素的二叉树*/
    return T;
}
void PreOrder(struct TreeNode *T){/*前序遍历*/
    if(T!=NULL){
        printf("\t%d",T->data);
        PreOrder(T->left);
        PreOrder(T->right);
    }
}
void InOrder(struct TreeNode *T){/*中序遍历*/
    if(T!=NULL){
        InOrder(T->left);
        printf("\t%d",T->data);
        InOrder(T->right);
    }
}
void PostOrder(struct TreeNode *T){/*后序遍历*/
    if(T!=NULL){
        PostOrder(T->left);
        PostOrder(T->right);
        printf("\t%d",T->data);
    }
}
int main(){
    struct TreeNode *T;
    T=NULL;
    for(int i=0;i<12;i++){
        T=add(T,i);
    }
    printf("前序遍历:\n");
    PreOrder(T);
    printf("\n中序遍历:\n");
    InOrder(T);
    printf("\n后序遍历:\n");
    PostOrder(T);
    T=deleteNode(T,3);
    T=deleteNode(T,5);
    printf("\n删除节点值为3,5后的二叉树:");
     printf("\n前序遍历:\n");
    PreOrder(T);
    printf("\n中序遍历:\n");
    InOrder(T);
    printf("\n后序遍历:\n");
    PostOrder(T);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设二叉树的每个节点定义如下: ```c struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; ``` 其 `val` 表示节点,`left` 和 `right` 分别表示左子树和右子树。 以下是求从根节点给定节点的路径的 C 语言代码: ```c #include <stdio.h> #include <stdlib.h> struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNode* createNode(int val) { struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } int getPath(struct TreeNode* root, struct TreeNode* target, int* path, int index) { if (root == NULL) { return 0; } path[index] = root->val; if (root == target) { return 1; } if (getPath(root->left, target, path, index + 1) || getPath(root->right, target, path, index + 1)) { return 1; } return 0; } int main() { // 创建二叉树 struct TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); root->right->left = createNode(6); root->right->right = createNode(7); // 求从根节点给定节点的路径 int targetVal = 5; struct TreeNode* target = root->left->right; int path[100]; int found = getPath(root, target, path, 0); if (found) { printf("Path from root to target:\n"); for (int i = 0; i < found; ++i) { printf("%d ", path[i]); } printf("\n"); } else { printf("Target node not found in the tree.\n"); } // 释放二叉树的内存 free(root->left->right); free(root->left->left); free(root->right->right); free(root->right->left); free(root->left); free(root->right); free(root); return 0; } ``` 上面的 `getPath` 函数实现了求从根节点给定节点的路径,它的参数依次为: - `root`:当前子树的根节点; - `target`:要查找的目标节点; - `path`:保存路径的数组; - `index`:当前节点在路径的下标。 当找到目标节点时,返回 1,否则返回 0。在递归调用左右子树之前,将当前节点保存到路径数组,并且将下标加 1。如果左右子树有一颗包含目标节点,就返回 1,表示找到了目标节点。如果左右子树都不包含目标节点,就返回 0,表示没有找到目标节点。 在主函数,我们创建了一个二叉树,并且指定要查找为 5 的节点。然后调用 `getPath` 函数求解路径,最后打印出路径数组。注意,在程序结束前,需要释放二叉树的内存,避免内存泄漏。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值