算法训练营day20

一、最大二叉树
class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        //记录最大值的索引,左侧是左子树,右侧是右子树;
        //然后记录左子树的起始和终止索引,也记录右子树的起始和终止的索引,然后递归
        //循环条件(相反的就是终止索引) left < right
        return build(nums, 0, nums.length - 1);
    }

    public TreeNode build(int[] nums, int startIndex, int endIndex) {
        if(startIndex > endIndex) return null;
        int index = maxElementIndex(nums, startIndex, endIndex);
        TreeNode newNode = new TreeNode(nums[index]);
        newNode.left = build(nums, startIndex, index - 1);
        newNode.right = build(nums, index + 1, endIndex);
        return newNode;
    }

    public int maxElementIndex(int[] nums, int startIndex, int endIndex){
        int maxIndex = startIndex;
        for(int i = startIndex + 1; i <= endIndex; i++){
            maxIndex = nums[maxIndex] < nums[i] ? i : maxIndex;
        }
        return maxIndex;
    }
}
二、合并二叉树

参考617. 合并二叉树 - 力扣(LeetCode)

任选一棵树t1,将另外一棵树t2合并到t1上,会出现几种情况

注意递归的时传入函数为两个树对应的节点

  1. t1,t2对应节点都不为空,相加
  2. t1为空,或t2为空,使用三目运算符
  3. 都为空也用三目运算符,因为不影响
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null || root2 == null) {
            return root1 == null ? root2 : root1;
        }
        return dfs(root1, root2);
    }

    TreeNode dfs(TreeNode r1, TreeNode r2) {
        //如果r1 和 r2 中,只要有一个是null, 函数就直接返回
        if (r1 == null || r2 == null) {
            return r1 == null ? r2 : r1;
        }
        //让r1的值等于 r1和r2的值累加,再递归的计算两棵树的左节点,右节点
        r1.val += r2.val;
        r1.left = dfs(r1.left, r2.left);
        r1.right = dfs(r1.right, r2.right);
        return r1;
    }
}
三、二叉搜索树

复习概念

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        //终止条件为 root为null或者等于val,结合二叉搜索树的特性来进行递归操作
        if (root == null || root.val == val) return root;
        return root.val < val ? searchBST(root.right, val) : searchBST(root.left, val);
    }
}
四、验证二叉搜索树
class Solution {
    long pre = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        //递归以终为始思考,二叉树的性质是 左子树 < 当前node < 右子树
        //1.访问左子树,直到到达最左侧的子树,此时为 null 返回true,进行判断root.val <= pre,pre初始值是LONG.MIN_VALUE
        //2.然后在当前小子树,访问当前树的右子树,
        if (root == null) {
            return true;
        }
        // 访问左子树
        if (!isValidBST(root.left)) {
            return false;
        }
        // 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
        if (root.val <= pre) {
            return false;
        }
        pre = root.val;
        // 访问右子树
        return isValidBST(root.right);
    }
}
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值