返回

前端算法面试题必刷系列[49]:从93到94

前端

前端算法面试题必刷系列[49]:从93到94

在这一期,我们将讨论两道算法题:

    1. 完全二叉树的节点个数
    1. 二叉树的最近公共祖先

93. 完全二叉树的节点个数

题目
给定一个完全二叉树,计算它的节点个数。

完全二叉树是指,除了最底层结点的父结点可能存在一颗或两颗不完全子结点外,其余各层结点的子结点数目总是达到最大个数,并且最底层的结点都集中在最左边。

算法步骤

  1. 利用完全二叉树的特点,我们可以使用递归的方法来计算节点个数。
  2. 在递归过程中,如果当前结点不是空,则将当前结点的左右子结点也计入。
  3. 如果当前结点是空,则递归终止。

时间复杂度 :O(n),其中n是完全二叉树的节点个数。

空间复杂度 :O(h),其中h是完全二叉树的高度。

94. 二叉树的最近公共祖先

题目
给定一个二叉树,找到两个给定结点的最近公共祖先。

最近公共祖先是两个结点的最低公共祖先,即两个结点的祖先结点中,深度最深的那个。

算法步骤

  1. 从根结点开始,如果当前结点是两个给定结点的其中之一,则该结点是最近公共祖先。
  2. 如果当前结点的左子结点和右子结点分别是两个给定结点,则该结点是最近公共祖先。
  3. 如果当前结点的左子结点和右子结点中只有一个是给定结点,则该结点不是最近公共祖先,但可能包含最近公共祖先。继续遍历结点。
  4. 如果当前结点的左子结点和右子结点都不是给定结点,则该结点不包含最近公共祖先。继续遍历结点。

时间复杂度 :O(n),其中n是二叉树的节点个数。

空间复杂度 :O(h),其中h是二叉树的高度。

示例代码

以下代码演示了如何使用JavaScript解决这两道算法题:

// 93. 完全二叉树的节点个数
function countNodes(root) {
  if (root === null) {
    return 0;
  }

  let count = 1;
  count += countNodes(root.left);
  count += countNodes(root.right);

  return count;
}

// 94. 二叉树的最近公共祖先
function lowestCommonAncestor(root, p, q) {
  if (root === null || root === p || root === q) {
    return root;
  }

  let left = lowestCommonAncestor(root.left, p, q);
  let right = lowestCommonAncestor(root.right, p, q);

  if (left !== null && right !== null) {
    return root;
  }

  if (left === null) {
    return right;
  }

  if (right === null) {
    return left;
  }
}

希望这些解答和示例代码对您的学习有所帮助。请继续关注我们的前端算法面试题必刷系列,我们将继续为大家带来更多精彩内容。