T1 64. 求1+2+…+n
需要逻辑运算符的短路效应代替用if判断的递归终止条件
class Solution {
public int sumNums(int n) {
//逻辑符号的短路效果
//n > 1时递归 n=1短路相当于递归终止条件
boolean x = n>1 && (n += sumNums(n-1))>0;
return n;
}
}
T2 68 - I. 二叉搜索树的最近公共祖先
方一:递归 (今天主题是分治,递归比较符合练习目的)
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//p,q都大于根节点 最近公共祖先在右子树
if(root.val<p.val && root.val<q.val)
return lowestCommonAncestor(root.right,p,q);
//p,q都小于根节点 最近公共祖先在左子树
if(root.val>p.val && root.val>q.val)
return lowestCommonAncestor(root.left,p,q);
//一个大,一个小,说明分别在根节点的两边,是最近公共祖先
return root;
}
}
方二:迭代
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root!=null){
if(root.val>p.val && root.val>q.val)
root = root.left;
else if(root.val<p.val && root.val<q.val)
root = root.right;
else
break;
}
return root;
}
}
T3 68 - II. 二叉树的最近公共祖先
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//空树或者某个节点是根节点返回根
if(root==null || root==p || root==q) return root;
//左子树递归结果
TreeNode left = lowestCommonAncestor(root.left,p,q);
//右子树递归结果
TreeNode right = lowestCommonAncestor(root.right,p,q);
//左空即左子树没有p,q 任何一个,返回右子树的遍历结果
if(left==null) return right;
if(right==null) return left;
//左右非空,说明当前节点就是最近公共节点
return root;
}
}