判断二叉树是否为满二叉树

判断二叉树是否为满二叉树二叉树递归套路判断是否为满二叉树

1、题目

给定一棵二叉树的根节点,判断这棵二叉树是否为满二叉树。

2、分析

满二叉树:如果树的高度是 h h h,则节点数一定是 2 h − 1 2^h – 1 2h1

所以根据二叉树的递归套路:假设X为根节点的树,向左右子树收集两个信息:高度 h h h 和 节点数 n n n,判断是否满足满二叉树的条件。

另外,如果左树是满二叉树,右树是满二叉树,且左右树的高度一致,那么整棵树是满二叉树。

所以,也可以利用二叉树的递归套路,从左右树获取信息:(1)是否为满二叉树 (2)高度

3、实现

C++版

/* > File Name: 036.判断二叉树是否为满二叉树.cpp > Author: Maureen > Mail: > Created Time: 五 7/ 1 16:37:02 2022 / #include  
     #include  
     using namespace std; class TreeNode { 
    public: int value; TreeNode *left; TreeNode *right; TreeNode(int data) : value(data) { 
   } }; //方法1:收集整棵树的高度和节点数  //只有满二叉树满足:2^h - 1 == n class Info1 { 
    public: int height;//高度 int nodeCnt;//节点数 Info1(int h, int c) : height(h), nodeCnt(c) { 
   } }; Info1 *process1(TreeNode *x) { 
    if (x == nullptr) { 
    return new Info1(0, 0); } Info1 *leftInfo = process1(x->left); Info1 *rightInfo = process1(x->right); int height = max(leftInfo->height, rightInfo->height) + 1; int nodeCnt = leftInfo->nodeCnt + rightInfo->nodeCnt + 1; return new Info1(height, nodeCnt); } bool isFullBT1(TreeNode *root) { 
    if (root == nullptr) return true; Info1 *info = process1(root); return (1 << info->height) - 1 == info->nodeCnt; } //方法2: 收集 子树是否满二叉树 和 子树高度  //左树满 && 右树满 && 左树高度和右树高度一样,那么整棵树就是满的 class Info2 { 
    public: bool isFull; int height; Info2(bool isfull, int h) : isFull(isfull), height(h) { 
   } }; Info2 *process2(TreeNode *x) { 
    if (x == nullptr) { 
    return new Info2(true, 0); } Info2 *leftInfo = process2(x->left); Info2 *rightInfo = process2(x->right); int height = max(leftInfo->height, rightInfo->height) + 1; bool isFull = leftInfo->isFull && rightInfo->isFull && leftInfo->height == rightInfo->height; return new Info2(isFull, height); } bool isFullBT2(TreeNode *root) { 
    return process2(root)->isFull; } //for test  TreeNode *generate(int level, int maxl, int maxv) { 
    if (level > maxl || (rand() % 100 / (double)101) < 0.5) return nullptr; TreeNode *root = new TreeNode(rand() % maxv); root->left = generate(level + 1, maxl, maxv); root->right = generate(level + 1, maxl, maxv); return root; } TreeNode *generateRandomBST(int level, int value) { 
    return generate(1, level, value); } int main() { 
    srand(time(0)); int level = 5; int value = 100; int testTimes = ; cout << "Test begin:" << endl; for (int i = 0; i < testTimes; i++) { 
    TreeNode *root = generateRandomBST(level, value); if (isFullBT1(root) != isFullBT2(root)) { 
    cout << "Failed!" << endl; return 0; } } cout << "Success!" << endl; return 0; } 

Java 版

public class isFullBT { 
    public static class Node { 
    public int value; public Node left; public Node right; public Node(int data) { 
    this.value = data; } } // 第一种方法 // 收集整棵树的高度h,和节点数n // 只有满二叉树满足 : 2 ^ h - 1 == n public static boolean isFull1(Node head) { 
    if (head == null) { 
    return true; } Info1 all = process1(head); return (1 << all.height) - 1 == all.nodes; } public static class Info1 { 
    public int height; //高度 public int nodes; //节点数 public Info1(int h, int n) { 
    height = h; nodes = n; } } public static Info1 process1(Node head) { 
    if (head == null) { 
    return new Info1(0, 0); } Info1 leftInfo = process1(head.left); Info1 rightInfo = process1(head.right); int height = Math.max(leftInfo.height, rightInfo.height) + 1; int nodes = leftInfo.nodes + rightInfo.nodes + 1; return new Info1(height, nodes); } // 第二种方法 // 收集子树是否是满二叉树 // 收集子树的高度 // 左树满 && 右树满 && 左右树高度一样 -> 整棵树是满的 public static boolean isFull2(Node head) { 
    if (head == null) { 
    return true; } return process2(head).isFull; } public static class Info2 { 
    public boolean isFull; public int height; public Info2(boolean f, int h) { 
    isFull = f; height = h; } } public static Info2 process2(Node h) { 
    if (h == null) { 
    return new Info2(true, 0); } Info2 leftInfo = process2(h.left); Info2 rightInfo = process2(h.right); boolean isFull = leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height; int height = Math.max(leftInfo.height, rightInfo.height) + 1; return new Info2(isFull, height); } // for test public static Node generateRandomBST(int maxLevel, int maxValue) { 
    return generate(1, maxLevel, maxValue); } // for test public static Node generate(int level, int maxLevel, int maxValue) { 
    if (level > maxLevel || Math.random() < 0.5) { 
    return null; } Node head = new Node((int) (Math.random() * maxValue)); head.left = generate(level + 1, maxLevel, maxValue); head.right = generate(level + 1, maxLevel, maxValue); return head; } public static void main(String[] args) { 
    int maxLevel = 5; int maxValue = 100; int testTimes = ; System.out.println("测试开始"); for (int i = 0; i < testTimes; i++) { 
    Node head = generateRandomBST(maxLevel, maxValue); if (isFull1(head) != isFull2(head)) { 
    System.out.println("出错了!"); } } System.out.println("测试结束"); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223871.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:15
下一篇 2026年3月17日 下午1:15


相关推荐

  • 公钥和私钥的解释

    公钥和私钥的解释对称加密对称密钥加密 又称私钥加密 即信息的发送方和接收方用一个密钥去加密和解密数据 它的最大优势是加 解密速度快 适合于对大数据量进行加密 但密钥管理困难 采用单钥密码系统的加密方法 同一个密钥可以同时用作信息的加密和解密 这种加密方法称为对称加密 也称为单密钥加密 需要对加密和解密使用相同密钥的加密算法 由于其速度 对称性加密通常在消息发送方需要加密大量数据时使用 对称性加密也称为密钥加密

    2026年3月17日
    2
  • 缓存是什么?占内存吗?

    缓存是什么?占内存吗?

    2021年9月24日
    66
  • 软件工程之软件过程模型[通俗易懂]

    软件工程之软件过程模型[通俗易懂]软件过程模型软件过程模型习惯上也称为软件开发模型,它是软件开发全部过程、活动和任务的结构框架。瀑布模型:瀑布模型是将软件生存周期中的各个活动规定为依线性连接的若干阶段的模型,包括需求分析、设计、编码、测试、运行与维护。由前至后、相互衔接的固定次序,如同瀑布流水逐级下落。瀑布模型是以文档作为驱动、适合于软件需求很明确的软件项目的模型。V模型V模型是瀑布模型的一个变体。V模型提供了

    2025年6月23日
    6
  • 全网爆火的OpenClaw(龙虾)该怎么选?一文教你看懂龙虾的优势和劣势

    全网爆火的OpenClaw(龙虾)该怎么选?一文教你看懂龙虾的优势和劣势

    2026年3月13日
    2
  • Carson带你学Android:网络请求库Retrofit源码分析

    Carson带你学Android:网络请求库Retrofit源码分析前言在 Andrroid 开发中 网络请求十分常用而在 Android 网络请求库中 Retrofit 是当下最热的一个网络请求库今天 我将手把手带你深入剖析 Retrofitv2 0 的源码 希望你们会喜欢在阅读本文前 建议先阅读文章 这是一份很详细的 Retrofit2 0 使用教程 含实例讲解 目录 1 简介特别注意 准确来说 Retrofit 是一个 RESTful 的 HTTP 网络请求

    2026年3月19日
    4
  • 2021年7月整理–简单方法 暴力激活成功教程WIFI密码

    2021年7月整理–简单方法 暴力激活成功教程WIFI密码2021年7月整理–简单方法暴力激活成功教程WIFI密码很多人都面临过短期租房、短期出差、住院而没有WIFI可用等境遇,有的是宽带太多办不起、有的是临时一阵子不值得折腾、有的是运营商不给扯线等等原因。然后就用手机下载了WIFI智能钥匙等APP,然后发现卵用么有,根本没有人共享自家WIFI密码给你用。以下是按步骤整理的软件和详细教程笔记本电脑+软件暴力激活成功教程出的密码我亲身用这个软件解开N多个密码此软件是家用路由器安全审计工具,切勿用作非法用途!!!….

    2022年10月13日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号