返回
前端算法面试题必刷系列[49]:从93到94
前端
2023-12-24 12:50:05
前端算法面试题必刷系列[49]:从93到94
在这一期,我们将讨论两道算法题:
-
- 完全二叉树的节点个数
-
- 二叉树的最近公共祖先
93. 完全二叉树的节点个数
题目 :
给定一个完全二叉树,计算它的节点个数。
完全二叉树是指,除了最底层结点的父结点可能存在一颗或两颗不完全子结点外,其余各层结点的子结点数目总是达到最大个数,并且最底层的结点都集中在最左边。
算法步骤 :
- 利用完全二叉树的特点,我们可以使用递归的方法来计算节点个数。
- 在递归过程中,如果当前结点不是空,则将当前结点的左右子结点也计入。
- 如果当前结点是空,则递归终止。
时间复杂度 :O(n),其中n是完全二叉树的节点个数。
空间复杂度 :O(h),其中h是完全二叉树的高度。
94. 二叉树的最近公共祖先
题目 :
给定一个二叉树,找到两个给定结点的最近公共祖先。
最近公共祖先是两个结点的最低公共祖先,即两个结点的祖先结点中,深度最深的那个。
算法步骤 :
- 从根结点开始,如果当前结点是两个给定结点的其中之一,则该结点是最近公共祖先。
- 如果当前结点的左子结点和右子结点分别是两个给定结点,则该结点是最近公共祖先。
- 如果当前结点的左子结点和右子结点中只有一个是给定结点,则该结点不是最近公共祖先,但可能包含最近公共祖先。继续遍历结点。
- 如果当前结点的左子结点和右子结点都不是给定结点,则该结点不包含最近公共祖先。继续遍历结点。
时间复杂度 :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;
}
}
希望这些解答和示例代码对您的学习有所帮助。请继续关注我们的前端算法面试题必刷系列,我们将继续为大家带来更多精彩内容。