题解 | #统计农场牛数量#
题目考察的知识点
从题目考察的知识点来看,该题主要涉及了对二叉树的遍历、递归和数学计算(指数运算)的基本理解和应用。
- 二叉树遍历:题目中使用了先序遍历和中序遍历展开二叉树。
- 递归:在展开二叉树的过程中,使用了递归来处理左子树和右子树。
- 数学计算:在计算完全二叉树节点总数时,使用了指数运算和数学计算公式。
题目解答方法的文字分析
flattenTree
方法使用了先序遍历来展开二叉树为单链表。使用栈来模拟先序遍历的过程,每次出栈一个节点,并将其右子节点和左子节点入栈,同时进行指针的更新,直到栈为空。flattenII
方法使用了中序遍历来展开二叉树为链表。递归地处理左子树,然后将当前节点与前一个节点链接起来,并更新前一个节点为当前节点,最后递归处理右子树。countNodes
方法使用递归来计算完全二叉树中节点的总数。通过计算根节点的左子树和右子树的高度,判断是否为满二叉树,并根据不同情况递归计算左右子树的节点数量。
本题解析所用的编程语言
本题解析所用的编程语言是JavaScript。
完整且正确的编程代码
function countNodes(root) {
if (root === null) {
return 0;
}
// 计算左子树的高度
let leftDepth = getDepth(root.left);
// 计算右子树的高度
let rightDepth = getDepth(root.right);
// 如果左右子树高度相同,则说明左子树是满二叉树
if (leftDepth === rightDepth) {
// 左子树节点数量 = 2^leftDepth - 1
let leftCount = Math.pow(2, leftDepth) - 1;
// 加上根节点和右子树节点的数量,总节点数量 = 左子树节点数量 + 1 (根节点) + 右子树节点数量
return leftCount + 1 + countNodes(root.right);
} else {
// 如果左右子树高度不同,则说明右子树是满二叉树
// 右子树节点数量 = 2^rightDepth - 1
let rightCount = Math.pow(2, rightDepth) - 1;
// 加上根节点和左子树节点的数量,总节点数量 = 右子树节点数量 + 1 (根节点) + 左子树节点数量
return rightCount + 1 + countNodes(root.left);
}
}
// 计算树的高度
function getDepth(node) {
let depth = 0;
while (node !== null) {
depth++;
node = node.left;
}
return depth;
}
#面试高频TOP202#题解 | 前端刷题 文章被收录于专栏
题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码