代码随想录算法训练营第二十天|LeetCode 654.最大二叉树、LeetCode 617.合并二叉树、LeetCode 700.二叉搜索树中的搜索、LeetCode 98.验证二叉搜索树。

LeetCode 654.最大二叉树

题目链接:LeetCode 654.最大二叉树

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        TreeNode* root = new TreeNode(0);
        if(nums.size() == 1)
        {
            root -> val = nums[0];
            return root;
        }//特判:数组中只有一个数时直接构造二叉树返回
        int maxrootval = 0;
        int maxindex = 0;
        for(int i = 0;i < nums.size();i++)
        {
            if(nums[i] > maxrootval)
            {
                maxrootval = nums[i];
                maxindex = i;
            }
        }//找到数组中最大值及其下标
        root -> val = maxrootval;//构造根节点
        if(maxindex > 0)
        {
            vector<int> leftroot(nums.begin(),nums.begin() + maxindex);
            root -> left = constructMaximumBinaryTree(leftroot);
        }//左子树不为空时构造左子树
        if(nums.size() - 1 - maxindex > 0)
        {
            vector<int> rightroot(nums.begin() + maxindex + 1,nums.end());
            root -> right = constructMaximumBinaryTree(rightroot);
        }//右子树不为空时构造右子树
        return root;
    }
};

思路:通过前序遍历,先找到数组中的最大值及其下标,用该值来构造二叉树根节点;再通过下标将数组进行切分;最后将切分的数组作为左右子树继续进行遍历

小结:在进行左右子树的构造时,先要判断切分后的数组是否为空,不为空时才能继续进行构造。


LeetCode 617.合并二叉树

题目链接:LeetCode 617. 合并二叉树

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

思路: 先通过前序遍历确定根节点直接改变其中一个二叉树的值即可(相加);之后对两个二叉树的左右子树同时进行遍历,其中若有一个二叉树遍历到空节点,则返回另一个二叉树相同位置的节点(均为空时返回的是空节点)。

小结:这里直接对其中一个二叉树进行了修改,新构造一个二叉树也可以。


LeetCode 700.二叉搜索树中的搜索

题目链接:LeetCode 700. 二叉搜索树中的搜索

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

思路: 利用二叉搜索树的特性进行搜索(根节点比所有左子树的节点值大,根节点比所有右子树的节点值小)。当搜索到空节点或找到目标值时返回,若根节点的值比目标值大,则在根节点的左子树中继续进行遍历,否则在右子树中进行遍历。最后返回找到的根节点即可。


LeetCode 98.验证二叉搜索树

题目链接:LeetCode 98. 验证二叉搜索树

class Solution {
private:
    vector<int> vec;
    void traversal(TreeNode* root)
    {
        if(root == NULL)
        return;
        traversal(root -> left);
        vec.push_back(root -> val);
        traversal(root -> right);
    }
public:
    bool isValidBST(TreeNode* root) {
        vec.clear();
        traversal(root);
        for(int i = 1;i < vec.size();i++)
        {
            if(vec[i] <= vec[i - 1])
            return false;
        }
        return true;
    }
};

思路:将二叉树中的值通过中序遍历存入数组中,再判断数组是否有序即可。

小结:

1.在判断时,数组必须是有序数组,数组值不能相同。

2.借助数组来判断的思想比较巧妙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值