代码随想录 第20天 20的总结没看 | 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

leetcode:654. 最大二叉树 - 力扣(LeetCode)

思路:要用数组找到最大二叉数,首先要找到最大值的下标,通过那个下标求分割数组,下标就是二叉数的根节点,将最大值添加到根节点后即可利用递归来用maxIndex分割左右二叉树。

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);
        // 根据maxIndex划分左右子树
        root.left = constructMaximumBinaryTree1(nums, leftIndex, maxIndex);
        root.right = constructMaximumBinaryTree1(nums, maxIndex + 1, rightIndex);
        return root;
    }
}

leetcode:617. 合并二叉树 - 力扣(LeetCode)

思路:两个节点,注意为空的情况,为空返回另一个,使用前序遍历,然后就是将两个树的节点值相加,左右二叉数直接递归

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)

思路:是二叉搜索树!!!,是按顺序来的,找一个数看比节点大还是小,大就往右走找更大,小就往左啊,找更小!!!!!!!!傻了

class Solution {
    // 递归,利用二叉搜索树特点,优化
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null || root.val == val) {
            return root;
        }
        //判断和val的值大还是小......啊,难怪
        if (val < root.val) {
            return searchBST(root.left, val);
        } else {
            return searchBST(root.right, val);
        }
    }
}

 

leetcode:98. 验证二叉搜索树 - 力扣(LeetCode)

思路:主要验证中序遍历是不是从小到达排序,这里选择用递归将上一个root存起来,和这次的比对

class Solution {
    TreeNode node = null;
    public boolean isValidBST(TreeNode root) {
        //
        if(root == null) return true;
        //中序
        //left
        if(!isValidBST(root.left)){
            return false;
        }
        ////将前后两两节点进行比对

        if(node != null && root.val <= node.val){
            return false;
        }
        node = root;
        //right

        return isValidBST(root.right);
    }
}

 

posted @ 2024-03-13 21:24  22软工冷薄  阅读(1)  评论(0编辑  收藏  举报