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

654. 最大二叉树

问题描述:

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
链接:https://leetcode.cn/problems/maximum-binary-tree

解题思路:构造树的建立优先考虑先序遍历(根左右),先考虑根节点,然后再考虑左右子树。

递归三部曲:

①递归函数的参数和返回值:参数就是传入的是存放元素的数组,以及构造最大二叉树的元素的区间。

②确定终止条件:当递归遍历的时候,如果传入的数组内没有元素,则返回null;如果传入的数组等于一,则说明遍历到了叶子节点,那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。

③确定单层递归的逻辑:对即将导入的数组进行遍历,查找到数组元素中的最大值作为根节点,并记录当前根节点所在原有数组内的下标(记录下标是为了更好的对数组元素进行划分),并且将查找出的最大值传递给新建的根节点上,然后使用此函数逐渐开始左右子树的遍历,最后返回根节点。

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return constructMaximumBinaryTree1(nums,0,nums.length);
    }
    public TreeNode constructMaximumBinaryTree1(int []nums, int leftindex,int rightindex){
        if(rightindex - leftindex < 1){     //没有元素了
            return null;
        }
        if(rightindex - leftindex == 1){
            return new TreeNode(nums[leftindex]);
        }
        int maxIndex = leftindex;
        int maxVal = nums[maxIndex];
        for(int i = leftindex + 1; i < rightindex; i++){
            if(nums[i] > maxVal){
                maxVal = nums[i];
                maxIndex = i;
            }
        }
        TreeNode root = new TreeNode(maxVal);
        root.left = constructMaximumBinaryTree1(nums,leftindex,maxIndex);
        root.right = constructMaximumBinaryTree1(nums,maxIndex + 1,rightindex);
        return root;
    }
}

617. 合并二叉树 

 题目描述:

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。注意: 合并过程必须从两个树的根节点开始。

 解题思路:题目给了两棵树,自然是要两棵树一起遍历,首先分别对两棵树从根节点但开始遍历,当树一的节点为null的时候,返回树二节点,当树二节点null时,返回树一节点(如果两者都为null返回的自然也是null);对树一的节点的值进行与数二相加的运算,然后分别按照左右子树遍历,最后返回树一(两棵树直接在树一上面做的操作)

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;

    }
}

700. 二叉搜索树中的搜索 

 题目描述:给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

解题思路:首先判断root是否为空,如果为空,则直接返回根节点为null;再看root是否为将要寻找的值,如果是,依旧return root;此时root代表的是我们要查找的值。因为二叉树是二叉搜索树,所以树中的节点都是有规律的。当要查找的数值大于根节点时,我们就开始遍历右子树,当查找的数值小于根节点时,我们要遍历左子树。当我们递归遍历的时候,需要定义一个result来接收我们遍历的结果。

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if(root == null || root.val == val){
            return root;
        }
        TreeNode result = new TreeNode();
        if(root.val > val){
            result = searchBST(root.left,val);
        }
        if(root.val < val){
            result = searchBST(root.right,val);
        }
        return result;

    }
}

 98. 验证二叉搜索树

 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

        节点的左子树只包含 小于 当前节点的数。
        节点的右子树只包含 大于 当前节点的数。
        所有左子树和右子树自身必须也是二叉搜索树

class Solution {
    TreeNode max;
    public boolean isValidBST(TreeNode root) {
        if(root == null)  return true;
        boolean left = isValidBST(root.left);
        if(!left)  return false;
        if(max != null && root.val <= max.val){
            return false;
        }
        max = root;
        boolean right = isValidBST(root.right);
        return right;

    }
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值