Day20(Day19摆烂).最大二叉树.合并二叉树.BST二叉搜索树中的搜索.验证二叉搜索树

成年人的世界,似乎只有赚到足够的钱,才能过上简单、安逸、自由的生活,才能让自己活得更有底气些。所以,多一些努力吧,少点功夫矫情。

654.最大二叉树

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        TreeNode* node = new TreeNode(0);//初始化一个节点并且赋值为0;
        if(nums.size()==1) //说明这个数组只有一个
        { 
            node->val=nums[0];//让node的值为数组第一个,并返回
            return node;
        }
        int max = 0;//存最大值!
        int foot = 0;//存下标 ps:以后要用index表示下标,foot太low了
        for(int  i = 0;i <nums.size();i++)
        {
            if(nums[i]>max)
            {
                max=nums[i];
                foot=i;
            }
        }
        node->val=max;//让max为node的值
        if(foot>0)//左子树
        {
            vector<int> leftVec(nums.begin(),nums.begin()+foot);//左闭右开区间
            node->left=constructMaximumBinaryTree(leftVec);
        }
        if(foot<nums.size()-1)//右子树
        {
            vector<int> rightVec(nums.begin()+foot+1,nums.end());//区间同上
            node->right=constructMaximumBinaryTree(rightVec);
        }

        return node;
    }
};

617. 合并二叉树(前中后序都是可以的)

中序打个样!

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1==NULL) return root2;//如果一方为空,则返回另一方,另一方为空也没有关系返回的依旧是空
        if(root2==NULL) return root1;
        //重复利用树1
        root1->val+=root2->val;//合并,在此处root1的值已经改变
        root1->left=mergeTrees(root1->left,root2->left);//递归
        root1->right=mergeTrees(root1->right,root2->right);
        return root1;
    }
};

700. 二叉搜索树中的搜索(BST)

首先理解二叉搜索树的概念
(来自百度资料)

二叉查找树 (Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的 二叉树 :
若它的左子树不空,则左子树上所有结点的值均小于它的 根结点 的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

简单来说
左子树的值小于根,右子树的值大于根(如果不为空的话)
1.迭代法
利用BST的特性来求解

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        while(root!=NULL)//直到遇到空节点时返回,例如BST为[] 或 搜索的值不存在,跳出循环,返回NULL
        {
            if(val>root->val)//说明要在BST的左子树查找
                root= root->right;
            else if(val<root->val)//说明要在BST的右子树查找.注意else
                root= root->left;
            else return root;//等于情况
        }
        return NULL;
    }
};

2.递归法

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if(root == NULL || root->val == val) return root;//空返回空,值返回值
        TreeNode* temp; //用来保存下面递归返回的子树
        if(val>root->val) temp=searchBST(root->right, val);
        else if(val<root->val) temp=searchBST(root->left, val);
        return temp;
    }

98.验证二叉搜索树

根据BST 中序序列 左 中 右 的特性(单调递增)来思考
BST中不能有相同的元素!
1.数组法

class Solution {
private:
    vector<int> room;
     void putArr(TreeNode* root)//无返回值,让BST以中序数组存入vector中
    {
         if(root == NULL) return;//返回上一层
            putArr(root->left);//左
            room.push_back(root->val);//中
            putArr(root->right);//右
    }
public:
    bool isValidBST(TreeNode* root) {
       room.clear();
       putArr(root);//存入
       for(int i=1;i<room.size();i++)
       {
           if(room[i]<=room[i-1])//“=”意思不能出现相同元素
            return false;
       }
       return true;
    }
};

2.双值判断
思路:其实还是中序 左 根 右 的比较

class Solution {
public:
    long long cmp = LONG_MIN;//外部放最小值
    bool isValidBST(TreeNode* root) {
        if(root == NULL) return true;
        //long long cmp=LONG_MIN;//long long类型最值学习!!!这里放最小值为错,最小值一直未变!
        //改为静态static 每递归一次,又会重新定义为最小值,所以要在最外层定义
        bool leftT = isValidBST(root->left);//左子树判断 (定义left来保存其真假,下同)
        if(root->val> cmp) cmp = root->val;//主体比较思路
        else return false;
        bool rightT=isValidBST(root->right);//右子树判断
        return leftT&&rightT;//如果两子树都符合BTS的定义,则返回真,如果至少有一侧不满足,返回假
        
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值