@ 代码随想录算法训练营第四周(C语言)|Day20(二叉树)

@ 代码随想录算法训练营第四周(C语言)|Day20(二叉树)

Day20、二叉树(包含题目 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树 )

654.最大二叉树

题目描述

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

二叉树的根是数组中的最大元素。
左子树是通过数组中最大值左边部分构造出的最大二叉树。
右子树是通过数组中最大值右边部分构造出的最大二叉树。

题目解答

struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {
    if(numsSize==0){
        return NULL;
    }
    struct TreeNode*root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->left=NULL;
    root->right=NULL;
    int index;
    int maxnum=0;
    for(int i=0;i<numsSize;i++){
        if(maxnum<nums[i]){
            index=i;
            maxnum=nums[i];
        }
    }
    root->val=maxnum;
    if(numsSize==1){
        return root;
    }
    root->left=constructMaximumBinaryTree(nums,index);
    root->right=constructMaximumBinaryTree(nums+index+1,numsSize-index-1);
    return root;

}

题目总结

创造数组更简单一点的。

617.合并二叉树

题目描述

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

题目解答

struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2) {
    if(root1==NULL){
        return root2;
    }
    if(root2==NULL){
        return root1;
    }

    root1->val+=root2->val;
    root1->left=mergeTrees(root1->left,root2->left);
    root1->right=mergeTrees(root1->right,root2->right);

    return root1;
}

题目总结

两个树的合并。

700.二叉搜索树中的搜索

题目描述

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

题目解答

struct TreeNode* searchBST(struct TreeNode* root, int val) {
    if(root==NULL){
        return NULL;
    }
    if(root->val==val){
        return root;
    }
    struct TreeNode*res=NULL;
    if(root->val<val){
        res=searchBST(root->right,val); 
    }else{
        res=searchBST(root->left,val);
    }

    return res;
}

题目总结

简单。

98.验证二叉搜索树

题目描述

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

题目解答

 int maxnum=-1111;
bool isValidBST(struct TreeNode* root) {
    if(root==NULL){
        return true;
    }
    bool left=isValidBST(root->left);
    if(root->val>maxnum){
        maxnum=root->val;
    }else{
        return false;
    }

    bool right=isValidBST(root->right);
    return left&&right;
}

题目总结

不能单纯的比较左节点小于中间节点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值