Day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654.最大二叉树

由于题目要求是在数组上选最大为根,该最大值左边的元素构建左子树,右边的元素构建右子树,也就是将所给数组进行合理的切分,看到二叉树的题目就想遍历顺序,这道题用先序遍历更为合适,先构造根节点再递归地构造其左子树和右子树

class Solution {
public:
    int findMax(vector<int>& nums){
        int maxIndex=-1;
        int max=0;
        for (int i = 0; i < nums.size(); ++i) {
            if(nums[i]>max){
                max=nums[i];
                maxIndex=i;
            }
        }
        return maxIndex;
    }
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if(nums.size()==1) {//终止条件是数组被切分到仅有一个元素
            return new TreeNode(nums[0]);
        }
        int index= findMax(nums);
        TreeNode*root= new TreeNode(nums[index]);//构造根节点
        if(index>0){//最大值的左边还有至少一个元素递归构建左子树,否则终止
            vector<int> leftNums(nums.begin(),nums.begin()+index);
            root->left= constructMaximumBinaryTree(leftNums);
        }
        if(index<nums.size()-1){//最大值的右边还有至少一个元素递归构建右子树,否则终止
            vector<int> rightNums(nums.begin()+index+1,nums.end());
            root->right= constructMaximumBinaryTree(rightNums);
        }
        return root;
    }
};

617.合并二叉树

用层序遍历进行合并,保证同时遍历两颗树的同一位置,这样就可以达到:两棵树都有的结点值相加,一棵树有一棵树没有的结点,移动到结果树里

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1== nullptr)return root2;
        if(root2== nullptr)return root1;
        queue<TreeNode*> q;
        q.push(root1);
        q.push(root2);
        while (!q.empty()){
            TreeNode*node1=q.front();
            q.pop();
            TreeNode*node2=q.front();
            q.pop();
            node1->val+=node2->val;
            if(node1->left!= nullptr&&node2->left!= nullptr){
                q.push(node1->left);
                q.push(node2->left);
            }
            if(node1->right!= nullptr&&node2->right!= nullptr){
                q.push(node1->right);
                q.push(node2->right);
            }
            if(node1->left== nullptr&&node2->left!= nullptr){
                node1->left=node2->left;
            }
            if(node1->right== nullptr&&node2->right!= nullptr){
                node1->right=node2->right;
            }
        }
        return root1;
    }
};

700.二叉搜索树中的搜索

由于二叉搜索树的有序特性,所以给定目标值后,若根节点的值小于目标值则去右子树搜索,反之则去左子树搜索

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;
    }
};

98.验证二叉搜索树

验证左子树和右子树均为二叉搜索树,二叉搜索树的常用遍历方式是中序遍历,用pre指针跟踪前一个结点的值,从左向右遍历,遇到pre结点的值大于等于当前结点的值的情况,就可以说明这棵树不是二叉搜索树

class Solution {
public:
    TreeNode*pre=nullptr;
    bool isValidBST(TreeNode* root) {
        if(root==nullptr)return 1;
        int left=isValidBST(root->left);
        if(pre!=nullptr&&pre->val>=root->val)return false;
        pre=root;
        int right=isValidBST(root->right);
        return left&&right;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值