Day31-代码随想录-最大二叉树654+合并二叉树617+二叉搜索树中的搜索700
最大二叉树题目如下:
思路:这个跟构造二叉树是差不多的,只不过需要每次递归需要找到数组的最大值,然后根据最大值对数组进行左右分割,遵循左闭右开的准则。
代码如下:
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return constructMaximumBinaryTree1(nums, 0, nums.length);
}
public TreeNode constructMaximumBinaryTree1(int[] nums, int leftIndex, int rightIndex) {
//1.递归终止条件:
if((rightIndex - leftIndex) < 1) return null;
//2.判断特殊情况,若数组只有一个元素
if((rightIndex - leftIndex) == 1){
return(new TreeNode(nums[leftIndex]));
}
//3.找出数组中的最大值及其下标:不用每次又新建数组,直接用索引来分割
int maxIndex = leftIndex;
int maxValue = nums[maxIndex];
for(int i = leftIndex+1 ; i < rightIndex; i++){
if(nums[i] > maxValue){
maxIndex = i;
maxValue = nums[i];
}
}
//4.递归构造中节点、左子树和右子树
TreeNode root = new TreeNode(maxValue);
//将矩阵不断进行分割
root.left = constructMaximumBinaryTree1(nums, leftIndex, maxIndex);
root.right = constructMaximumBinaryTree1(nums, maxIndex+1, rightIndex);
return root;
}
}
合并二叉树题目如下:
这道题的思路较为简单,其实跟操作一棵二叉树是差不多的,无论用哪种遍历都可以,但是需要同时操作两棵树的节点,代码如下:
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
//1.明确终止条件
if(root1 == null) return root2;
if(root2 == null) return root1;
//2.单层递归逻辑
root1.val += root2.val;
root1.left = mergeTrees(root1.left, root2.left);
root1.right = mergeTrees(root1.right, root2.right);
return root1;
}
}
二叉搜索树中的搜索题目如下:
刚开始还在疑惑怎么返回子树,还说确定了节点之后要不要再遍历它的子树,完全没必要,这是自己没掌握好二叉树的结构。只要匹配到与目标值相等的节点,直接返回即可,因为他返回的是TreeNode结构,又不是数值int。这样代码就会很简单:
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);
}
}