【代码随想录|二叉搜索树】

654.最大二叉树

在构建二叉树的时候必须用前序遍历,因为只有这样才能每次从根节点开始创建,再继续创建它的左右结点。

题目链接https://leetcode.cn/problems/maximum-binary-tree

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        TreeNode*root=new TreeNode(0);
        if(nums.size()==1){
            root->val=nums[0];//当只有一个数的时候,数组里的第一个数就是最大值
        }
        int maxvalue=INT_MIN;
        int maxindex=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]>maxvalue){
                maxvalue=nums[i];
                maxindex=i;
            }
        }
        root->val=nums[maxindex];
        if(maxindex>0){
            vector<int> newvec(nums.begin(),nums.begin()+maxindex);
            root->left=constructMaximumBinaryTree(newvec);
        }
        if(maxindex<nums.size()-1){
            vector<int> newvec(nums.begin()+maxindex+1,nums.end());
            root->right=constructMaximumBinaryTree(newvec);
        }
        return root;
    }
};

617.合并二叉树

题目链接. - 力扣(LeetCode)

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, 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;//最后把构建好的root2返回
    }
};

700.二叉搜索树中的搜索

题目链接https://leetcode.cn/problems/search-in-a-binary-search-tree

写的时候写的下面这个代码报错了,想了想报错的原因可能是这样会把全部节点遍历, 题目给的那个数据正确结点在左子树,而遍历完左子树result拿到值之后又继续遍历右子树了那就把结果更新为NULL了返回自然也是NULL

class Solution {//错误代码
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root==NULL||root->val == val)
            return root;
        TreeNode* result = NULL;
        if (root->left){
            result = searchBST(root->left, val);}
        if (root->right){
            result = searchBST(root->right, val);}
            return result;
    }
};
class Solution {//正确代码
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root==NULL||root->val == val)
            return root;
        TreeNode* result = NULL;
            if(root->val>val)result = searchBST(root->left, val);//当值比根节点小往左遍历
            if(root->val<val)result = searchBST(root->right, val);//当值比根节点大往右遍历
            return result;
    }
};

 也可以用迭代法

class Solution {//正确代码
public:
    TreeNode* searchBST(TreeNode* root, int val) {
       while(root!=NULL){
        if(val<root->val){
            root=root->left;
        }
        else if(val>root->val){
            root=root->right;
        }
        else return root;
       }
       return NULL;
    }
};

但是这里在写的时候发现如果用两个If就会报错

class Solution {//错误代码
public:
    TreeNode* searchBST(TreeNode* root, int val) {
       while(root!=NULL){
        if(val<root->val){
            root=root->left;
        }
        if(val>root->val){//可能会NULL->val报错
            root=root->right;
        }
        else return root;
       }
       return NULL;
    }
};

因为在遍历的时候,遍历到的结点为空后那就说明已经找不到了直接就会直接退出循环返回NULL,但是用两个if语句的话,我就会把root的空节点进行指向val那肯定就报错了,所以得用else if 判断完赋值后我就去看看这个节点是不是为空了,当然空节点就不会进行指向,也就不会报错了。

98.验证二叉搜索树

题目链接https://leetcode.cn/problems/validate-binary-search-tree

思路应该是把二叉搜索树按照中序遍历进行比较,因为中序遍历排序下来左<根<右,判断条件里面前一个节点如果大于等于了这个节点直接返回false,二叉搜索树是从小到大排列的所以进行判断的时候只依照同一个条件就能有效判断了

最开始这么写怎样都报错

后来发现把pre定义写在递归里面的话每一次的pre都是该结点的值,那每次都是自己与自己进行比较了,没有与前一个节点进行比较,赋值的话应该要写在判断条件的下面,要每一次判断与上一个结点的值之后再赋值,如果赋值在判断之前的话,那就会每次都跟自己比较了。

class Solution {//错误代码
public:
    bool isValidBST(TreeNode* root) {
        TreeNode*pre=root;
        if(root==NULL)return true;
        bool left= isValidBST(root->left);
        if(pre!=NULL&&pre->val>=root->val)return false;
        bool right=isValidBST(root->right);
        return right&&left;
        
    }
};

class Solution {//正确代码
public:
    TreeNode* pre = NULL;//要在外面进行定义,在里的话每一次pre的值就都是NULL了
    bool isValidBST(TreeNode* root) {

        if (root == NULL)
            return true;
        bool left = isValidBST(root->left);
        if (pre != NULL && pre->val >= root->val)
            return false;
        pre = root;//pre赋值给上一个结点
        bool right = isValidBST(root->right);

        return right && left;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值