一、654. 最大二叉树
给定一个不重复的整数数组 nums 。
最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
TreeNode root = construct(nums, 0, nums.length-1);
return root;
}
private static TreeNode construct(int []arry, int start, int end){
if(start>end){
return null;
}
if(start==end){
return new TreeNode(arry[start]);
}
int idx= findMax(arry, start,end);
TreeNode root = new TreeNode(arry[idx]);
root.left = construct(arry, start, idx-1);
root.right = construct(arry, idx+1, end);
return root;
}
private static int findMax(int []arr, int start, int end){
int idx=-1;
int max = Integer.MIN_VALUE;
for(int i =start; i<=end; i++){
if(arr[i]>max){
max=arr[i];
idx=i;
}
}
return idx;
}
}
二、617. 合并二叉树
给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。
你需要将这两棵树合并成一棵新二叉树。
合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
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;
return val< root.val?searchBST(root.left,val):searchBST(root.right,val);
}
}
四、 98. 验证二叉搜索树
class Solution {
public boolean isValidBST(TreeNode root) {
return validate(root,null,null);
}
public boolean validate(TreeNode root, Integer low, Integer high){
if(root==null)
return true;
if((low!=null && root.val<=low) || (high!=null && root.val>=high))
return false;
return validate(root.left,low,root.val)&&validate(root.right,root.val,high);
}
}