程式碼隨想錄 第20天 20的總結沒看 | 654.最大二叉樹 ● 617.合併二叉樹 ● 700.二叉搜尋樹中的搜尋 ● 98.驗證二叉搜尋樹

22软工冷薄發表於2024-03-13

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

相關文章