算法day15-二叉树(5)

目录

  1.  654 最大二叉树
  2. 617 合并二叉树
  3. 700 二叉搜索树中的搜索
  4. 验证二叉搜索树

一、最大二叉树

https://leetcode.cn/problems/maximum-binary-tree/?envType=problem-list-v2&envId=8At1GmaZ

   思路:凡是构造二叉树的题目,都用前序遍历

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        //终止条件
        if(nums.length == 1){
            return new TreeNode(nums[0]);
        }
        int maxValue = Integer.MIN_VALUE;
        int index = 0;
        //找最大的节点值及下标
        for(int i=0; i<nums.length; i++){
            if(nums[i] > maxValue){
                maxValue = nums[i];
                index = i;
            }
        }
        TreeNode node = new TreeNode(maxValue);
        if(index > 0){      //确保左区间至少有一个元素
            int[] leftNums = Arrays.copyOfRange(nums, 0, index);     //左闭右开区间
            node.left = constructMaximumBinaryTree(leftNums);
        }
        if(index < nums.length-1){      //确保右区间至少有一个元素
            int[] rightNums = Arrays.copyOfRange(nums, index+1, nums.length);
            node.right = constructMaximumBinaryTree(rightNums);
        }
        return node;
    }
}

 

二、合并二叉树

https://leetcode.cn/problems/merge-two-binary-trees/?envType=problem-list-v2&envId=8At1GmaZ

   思路:这里在root1的结构上进行改动,用前序遍历的思想,两棵树遍历的进度是相同的。

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

三、二叉搜索树中的搜索

  https://leetcode.cn/problems/search-in-a-binary-search-tree/description/?envType=problem-list-v2&envId=8At1GmaZ

 

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

 

四、验证二叉搜索树

https://leetcode.cn/problems/validate-binary-search-tree/?envType=problem-list-v2&envId=8At1GmaZ

 

 

  思路:按中序遍历的方式来遍历二叉搜索树,根据二叉搜索树的性质,中序遍历得到的结果应该是递增的,所以就可以通过判断前一个元素的值是否小于当前节点的值来确定该树是否为二叉搜索树。

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

 

posted @ 2025-05-13 23:37  筱倩  阅读(6)  评论(0)    收藏  举报