剑指 Offer 64. 求1+2+…+n
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
提议理解: 可以使用平均值(需要除法),迭代(for,while等循环),递归(加法) 最终采用加法和&&运算符,0位false
- 只需递归就行,n=0为终止条件
限制: 1 <= n <= 10000
示例 1: 输入: n = 3 输出: 6
示例 2: 输入: n = 9 输出: 45
var sumNums = function(n) {
return n && (n+sumNums(n-1))
};
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
提议理解: 二叉搜索树,左节点小于根节点,右节点大于根节点 公共祖先,并不一定是左右字数刚好符合 p和q为节点
- 如果p.val>q.val进行交换
- 迭代root,root.val < p.val 则在右子树中
- root.val > p.val 则在左子树中
说明: 所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。
var lowestCommonAncestor = function(root, p, q) {
if(p.val>q.val){
const temp=q;
q=p;
p=q;
}
while (root) {
if(root.val<p.val){
root=root.right
}else if(root.val>q.val){
root=root.left
}else{
breack;
}
}
return root
};
剑指 Offer 68 - II. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
提议理解: 找出二叉树中的第一个公共祖先 深度优先 后序遍历
- 如果root存在或root===p或root===q则返回root;
- 如果不是左节点返回右节点
- 如果不是右节点返回左节点
- 如果后不在返回房钱节点
说明: 所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉树中。
var lowestCommonAncestor = function(root, p, q) {
if(!root || root === p || root===q) return root;
const left = lowestCommonAncestor(root.left,p,q);
const right = lowestCommonAncestor(root.right,p,q);
if(!left) return right;
if(!right) return left;
return root;
};