1 最大二叉树
题目
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
代码
class Solution {
Map<Integer,Integer> map;
public TreeNode constructMaximumBinaryTree(int[] nums) {
map=new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(nums[i],i);
}
return find(nums,0,nums.length);
}
public TreeNode find(int[] nums,int begin,int end){
if(end==begin) return null;
if(end-begin==1) return new TreeNode(nums[begin]); //可有可无
int max=nums[begin],maxIndex=begin;
for(int i=begin;i<end;i++){
if(nums[i]>max){
max=nums[i];
maxIndex=i;
}
}
TreeNode root=new TreeNode(max);
root.left=find(nums,begin,maxIndex);
root.right=find(nums,maxIndex+1,end);
return root;
}
}
总结
第一遍提交错误,原因竟然是我再找最大值的时候,i指的是元素小标,可是我条件写的是i<数组个数(end-begin),这也太不认真了
2 合并二叉树
题目
给你两棵二叉树: 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;
}
}
总结
递归写起来,代码好简洁。
偷懒一下,迭代就不写了。
3 二叉搜索树中的搜索
题目
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
代码
//递归
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if( root==null || root.val==val) return root;
if(root.left==null && root.right==null) return null;
if(root.val>val){
TreeNode left=searchBST(root.left,val);
if(left!=null) return left;
}
else{
TreeNode right=searchBST(root.right,val);
if(right!=null) return right;
}
return null;
}
}
//迭代
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while(root!=null){
if(root.val>val) root=root.left;
else if(root.val<val) root=root.right;
else return root;
}
return null;
}
}
总结
迭代比递归代码简单,主要还是二叉搜索树的特点。
刚开始看题目,我当然没有注意到二叉搜索树的特点,就直接递归,哐哐哐写,最后那个判断大小还是看了参考代码,改良了一下我写的代码-_-||
4 验证二叉搜索树
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
代码
class Solution {
TreeNode max;
public boolean isValidBST(TreeNode root) {
if(root==null ) return true;
boolean left=isValidBST(root.left);
if(left==false) return false;
if(max!=null && root.val<=max.val) return false;
max=root;
boolean right=isValidBST(root.right);
return right;
}
}
总结
我以为很简单,naive啊!结果深深陷入陷阱一,还对着参考代码,不明白max干嘛的。
参考: 代码随想录
我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点,而不是单纯的比较左节点小于中间节点,右节点大于中间节点。
这不是二叉搜索树!