算法打卡第十九天

129 阅读2分钟
  1. 剑指 Offer 64. 求1+2+…+n
  2. 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
  3. 剑指 Offer 68 - II. 二叉树的最近公共祖先

剑指 Offer 64. 求1+2+…+n

求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

提议理解: 可以使用平均值(需要除法),迭代(for,while等循环),递归(加法) 最终采用加法和&&运算符,0位false

  1. 只需递归就行,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为节点

  1. 如果p.val>q.val进行交换
  2. 迭代root,root.val < p.val 则在右子树中
  3. 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. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

提议理解: 找出二叉树中的第一个公共祖先 深度优先 后序遍历

  1. 如果root存在或root===p或root===q则返回root;
  2. 如果不是左节点返回右节点
  3. 如果不是右节点返回左节点
  4. 如果后不在返回房钱节点

说明: 所有节点的值都是唯一的。 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;
};