45.求1+2+…+n
题目:
求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
题解:
- 使用
&&
巧妙的将n > 1作为递归结束的条件;
public int sumNums(int n) {
boolean x = n > 1 && (n += sumNums(n-1)) > 0;
return n;
}
46.二叉搜索树的最近公共祖先
题目:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
题解:
- 注意审题!这是一个 二叉搜索树;
- 如果p和q的值都大于root的值,则公共祖先是root.right;
- 如果p和q的值都小于root的值,则公共祖先是root.left;
- 如果二者的值有大于有小于root,则公共节点就是root;
- 可结合具体的例子进行理解。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while (root != null){
if (root.val < p.val && root.val < q.val)
root = root.right;
if (root.val > p.val && root.val > q.val)
root = root.left;
else break;
}
return root;
}
47.二叉树的最近公共祖先
题目:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
题解:
注意审题!!这是一个 二叉树;
- 递归结束的条件
- root为null || root等于p || root等于q 则返回root;
- 递推关系
- 递归调用lowestCommonAncestor函数,记录左右子树的返回节点left和right
- 哪边不为null,就说明哪边存在p或者q,因此
- 如果left和right均不为null,则说明p和q一边一个,则公共祖先为二者的父类root;
- 如果left为null,则说明p和q都在右侧,返回右侧节点;
- 如果right为null,则说明p和q都在左侧,返回左侧节点;
- 如果二者均为null,返回root或者null均可。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == p || root == q || root == null) return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left == null && right != null) return root;
else if (left == null) return right;
else if (right == null) return left;
return root;
}
马龙实现世乒赛男单三连冠、奥运会男单两连冠、全运会男单两连冠,你可曾知道他的郁郁不得志,曾经连续六年三届世乒赛被王皓挡在决赛之外,而同年龄的张继科早就功成名就。