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