LeetCode 654 最大二叉树
题目比较绕:每次递归都需要先找到最大的数,这个数左边的数放在节点左边,这个数右边的数放在节点右边。
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return travelsal(nums,0,nums.length);
}
public TreeNode travelsal(int[] nums,int leftIndex,int rightIndex){
if(rightIndex-leftIndex<1){
return null;
}
if(rightIndex-leftIndex==1){
return new TreeNode(nums[leftIndex]);
}
int max = nums[leftIndex];
int maxIndex = leftIndex;
for(int i = leftIndex+1;i<rightIndex;i++){
if(nums[i]>max){
max = nums[i];
maxIndex = i;
}
}
TreeNode root = new TreeNode(max);
root.left = travelsal(nums,leftIndex,maxIndex);
root.right = travelsal(nums,maxIndex+1,rightIndex);
return root;
}
}
LeetCode 617 合并二叉树
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1==null && root2 ==null){
return null;
}
if(root1==null) return root2;
if(root2==null) return root1;
TreeNode root = new TreeNode(root1.val+root2.val);
root.left = mergeTrees(root1.left,root2.left);
root.right = mergeTrees(root1.right,root2.right);
return root;
}
}
LeetCode 700 二叉搜索树中的搜索
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root.val>val){
if(root.left!=null){
return searchBST(root.left,val);
}else{
return null;
}
}else if(root.val<val){
if(root.right!=null){
return searchBST(root.right,val);
}else{
return null;
}
}else{
return root;
}
}
}
LeetCode 98 验证二叉搜索树
二叉搜索树有一个很重要的因素就是所有右树上的值都应该大于该节点,左树上的值都应该小于该节点。
当我们对二叉搜索树进行中序遍历时我们会发现:如果这个树是二叉搜索树,那么在中序遍历之后获得的数组一定是有序的。
所以我们可以设置一个node来记录前一个节点的值,如果后一个节点小于等于该节点,那么一定不是二叉搜索树
class Solution {
TreeNode max;
public boolean isValidBST(TreeNode root) {
if(root==null)return true;
boolean left = isValidBST(root.left);
if(!left) return false;
if(max!=null && root.val <=max.val){
return false;
}
max=root;
boolean right = isValidBST(root.right);
return right;
}
}