题解 | #统计农场牛数量#

题目考察的知识点

从题目考察的知识点来看,该题主要涉及了对二叉树的遍历、递归和数学计算(指数运算)的基本理解和应用。

  • 二叉树遍历:题目中使用了先序遍历和中序遍历展开二叉树。
  • 递归:在展开二叉树的过程中,使用了递归来处理左子树和右子树。
  • 数学计算:在计算完全二叉树节点总数时,使用了指数运算和数学计算公式。

题目解答方法的文字分析

  1. flattenTree 方法使用了先序遍历来展开二叉树为单链表。使用栈来模拟先序遍历的过程,每次出栈一个节点,并将其右子节点和左子节点入栈,同时进行指针的更新,直到栈为空。
  2. flattenII 方法使用了中序遍历来展开二叉树为链表。递归地处理左子树,然后将当前节点与前一个节点链接起来,并更新前一个节点为当前节点,最后递归处理右子树。
  3. 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#
题解 | 前端刷题 文章被收录于专栏

题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务