代码随想录 第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); } }