📜  检查给定的二叉树是否完美(1)

📅  最后修改于: 2023-12-03 14:55:50.639000             🧑  作者: Mango

检查给定的二叉树是否完美

在二叉树中,如果每个节点要么没有子节点,要么同时有两个子节点,那么这棵树就被称为完美二叉树。在本文中,我们将讨论如何检查给定的二叉树是否是完美二叉树。

完美二叉树的特性

完美二叉树具有以下特性:

  1. 所有叶子节点都在同一层上。也就是说,从根节点到最底层的叶子节点没有空缺。
  2. 所有非叶子节点都有两个子节点。
算法思路

我们可以使用递归的方式来检查给定的二叉树是否是完美二叉树。对于每个节点,我们可以递归地检查其左子树和右子树是否满足完美二叉树的条件。如果左子树和右子树都是完美二叉树且左右子树的高度相同,则该二叉树是完美二叉树。

JavaScript 实现

下面是使用 JavaScript 实现的二叉树节点和检查完美二叉树的函数:

// 二叉树节点的定义
class Node {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}

// 检查二叉树是否是完美二叉树
function isPerfectBinaryTree(root) {
  // 辅助函数:计算二叉树的高度
  function height(node) {
    if (node === null) {
      return 0;
    }
    return 1 + Math.max(height(node.left), height(node.right));
  }

  // 辅助函数:检查二叉树是否是完美二叉树
  function checkPerfect(node, h, level = 1) {
    if (node === null) {
      return true;
    }
    if (node.left === null && node.right === null) {
      // 叶子节点必须在最底层
      return h === level;
    }
    if (node.left === null || node.right === null) {
      // 非叶子节点必须同时有左右子节点
      return false;
    }
    return (
      checkPerfect(node.left, h, level + 1) &&
      checkPerfect(node.right, h, level + 1)
    );
  }

  const h = height(root);
  return checkPerfect(root, h);
}

// 创建一个完美二叉树
const root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
root.right.left = new Node(6);
root.right.right = new Node(7);

// 检查二叉树是否是完美二叉树
const isPerfect = isPerfectBinaryTree(root);
console.log(isPerfect);  // true

以上代码实现了二叉树节点的定义以及检查给定二叉树是否是完美二叉树的函数。我们创建了一个完美二叉树并通过调用函数进行检查,最终返回了结果 true

以上就是使用 JavaScript 检查给定二叉树是否是完美二叉树的介绍。代码片段中使用了递归来实现检查的过程,并给出了算法的详细思路。你可以根据自己的需求进行修改和拓展。