力扣第16天----第654题、第617题、第700题、第98题

力扣第16天----第654题、第617题、第700题、第98题

一、第654题–最大二叉树

​ 构造二叉树,一定要前序遍历----先确定中间节点的数值,再链接到左右子树上。中间节点数值,通过遍历,找出来。然后再递归方式----把左右子树中间节点,给整个二叉树的中间节点做链接。

class Solution {       //  左闭右闭
public:
    TreeNode* construct(vector<int>& nums, int left, int right){  //函数名字里,有左右节点的位置,所以要重新再def一个函数。
        if (right - left == 0) return new TreeNode(nums[left]);   //采用“左闭右闭”构建方式,终止条件是左右相等,这时构建一个节点。
        int maxv = 0;											  //找出中间节点数值,再构建新的节点。
        int index = 0;
        for (int i = left; i <= right; i++){
            if (nums[i] > maxv){
                maxv = nums[i];
                index = i;
            }
        }
        TreeNode* node = new TreeNode(maxv);                       
        if (index - left >= 1){                                  //单层递归条件。如果左边能构建子树,左边链接上。
            node ->left = construct(nums, left, index-1);
        }
        if (right - index >=1){                                  //单层递归条件。如果右边能构建子树,右边链接上。
            node -> right = construct(nums, index + 1, right);
        }

        return node;											 //返回节点
    }

    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {    //调用函数。
        return construct(nums, 0, nums.size() - 1);
    }
};

二、第617题–合并二叉树

​ 这是一道简单题,采用前序遍历。终止条件–两个子树有一个是空,就返回另一个;单层逻辑,根节点的值相加,root1和root2的左子树再合并一起,root1和root2的右子树再合并一起。返回整个二叉树的根节点。

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if (root1 == nullptr) return root2;   // 终止条件
        if (root2 == nullptr) return root1;
        root1->val += root2->val;             //单层逻辑,根节点处理方式

        root1 -> left = mergeTrees(root1->left, root2->left);    //单层逻辑,左右子树的逻辑。递归方式,合并每个子树
        root1 -> right = mergeTrees(root1->right, root2->right);
        return root1;
    }
};

三、第700题–二叉搜索树中的搜索

​ 利用BST的特性,采用前序遍历。终止条件–没找到、找到了,都返回root(没找到的话,当前节点root就是nullptr)。单层递归逻辑–val大于当前根节点数值,就向右侧找;反之,向左侧找。逐渐递归,找到最终的root(找到或者找不到,都返回root节点)。

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == nullptr || root->val == val) return root;
        TreeNode* result;
        if (val > root->val) result = searchBST(root->right , val);
        if (val < root->val) result = searchBST(root->left, val);
        return result;
    }
};

四、第98题–验证二叉搜索树

​ 这是一道好题。采用中序遍历+双指针。设置2个指针,左指针、右指针分别对应于BST中的“左中右”里的“左中”和“中右”。这2个指针逐个移动,每次都移动1个位置,然后逐个比较。

​ 先处理“左”,得到左子树是否为BST。再按照上面双指针思路,判断中是否满足递增。再判断右子树是否为BST。

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if (root == nullptr) return true;
        bool left = isValidBST(root->left);
        if ( pre != nullptr && pre->val >= root->val){
            cout << pre->val << ' ' <<root->val << endl;
            return false;
        }
       // if ( pre != nullptr )  cout << pre->val << '-' <<root->val << endl;
        pre = root;
        bool right = isValidBST(root->right);
        return left && right;
    }
    TreeNode* pre = nullptr;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值