- 654.最大二叉树
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; } }
与day19任务类似,都是要构建二叉树,必须用前序遍历
- 617.合并二叉树
-
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; } }
操作两个二叉树,改变一个二叉树就可以。
- 700.二叉搜索树中的搜索
-
class Solution { // 递归,普通二叉树 public TreeNode searchBST(TreeNode root, int val) { if (root == null || root.val == val) { return root; } TreeNode left = searchBST(root.left, val); if (left != null) { return left; } return searchBST(root.right, val); } } class Solution { // 递归,利用二叉搜索树特点,优化 public TreeNode searchBST(TreeNode root, int val) { if (root == null || root.val == val) { return root; } if (val < root.val) { return searchBST(root.left, val); } else { return searchBST(root.right, val); } } }
主要就是利用二叉搜索树的特点遍历
- 98.验证二叉搜索树
-
class Solution { TreeNode pre; public boolean isValidBST(TreeNode root) { if(root == null) return true; boolean left = isValidBST(root.left); if(pre != null && pre.val >= root.val){ return false; } pre = root; boolean right = isValidBST(root.right); return right&&left; } }
主要就是利用中序遍历,比较当前遍历的数值与前一位的数据的大小,用pre指针指向前一位