前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >完全二叉树与满二叉树:理解与区别

完全二叉树与满二叉树:理解与区别

原创
作者头像
Lorin 洛林
发布2023-11-17 19:35:46
3150
发布2023-11-17 19:35:46
举报
文章被收录于专栏:数据结构数据结构
  • hello,大家好,我是 Lorin ,首先祝大家双节快乐,这篇文章也是放假前的最后一篇文章,祝大家食用愉快,有所收获。

引言

  • 在计算机科学和数据结构领域,二叉树是一种基本的数据结构,常用于实现各种算法和数据处理。在二叉树的概念中,有两个重要的子类:完全二叉树和满二叉树。本文将详细介绍这两种类型的二叉树,探讨它们的特点、区别以及应用场景。

完全二叉树

  • 完全二叉树是一种特殊的二叉树,具有以下特点:

定义

代码语言:txt
复制
1、除了最后一层外,每一层的节点都被填满。
2、如果最后一层存在节点,那么这些节点从左到右依次填充,不留空缺。
3、完全二叉树的高度通常较小,具有良好的平衡性。

数组和完全二叉树转换

  • 由于完全二叉树的特殊性,我们可以用数组存储完全二叉树,下面我们看看它们之间如何转换:
  • 示例:
代码语言:txt
复制
数组:[1, 2, 3, 4, 5, 6, 7]

对应完全二叉树:
        1
       / \
      2   3
     / \ / \
    4  5 6  7

数组转完全二叉树

  • 给定一个数组 1, 2, 3, 4, 5, 6, 7,要将它转换为完全二叉树,可以按照以下步骤进行:
代码语言:txt
复制
数组中的第一个元素是树的根节点,即 1。

对于数组中的第 i 个元素,它的左子节点位于数组的第 2*i 个位置,右子节点位于数组的第 2*i+1 个位置。根据这个规则,构建树的其他节点。

左子节点:2*1 = 2,所以根节点 1 的左子节点是 2。
右子节点:2*1+1 = 3,所以根节点 1 的右子节点是 3。
根节点 2 的左子节点是 4,右子节点是 5。
根节点 3 的左子节点是 6,右子节点是 7。
重复上述步骤,直到数组中的所有元素都构建成二叉树。

完全二叉树转数组

  • 给定一个完全二叉树,要将它转换为数组,可以按照以下步骤进行:
代码语言:txt
复制
遍历二叉树,按照层次顺序从上到下、从左到右依次访问节点。
将每个访问的节点的值按照顺序存储到数组中。

Java 版实现

代码语言:java
复制
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

public class Convertor {

    // 将数组转换为完全二叉树
    public static TreeNode arrayToCompleteBinaryTree(int[] arr) {
        return arrayToCompleteBinaryTree(arr, 0);
    }

    private static TreeNode arrayToCompleteBinaryTree(int[] arr, int index) {
        if (index >= arr.length) {
            return null;
        }

        TreeNode root = new TreeNode(arr[index]);
        root.left = arrayToCompleteBinaryTree(arr, 2 * index + 1);
        root.right = arrayToCompleteBinaryTree(arr, 2 * index + 2);

        return root;
    }

    // 将完全二叉树转换为数组
    public static int[] completeBinaryTreeToArray(TreeNode root) {
        int height = getHeight(root);
        // 完全二叉树的节点数最大为满二叉树节点数 数组值为默认值0表示无该节点
        int[] arr = new int[(int) Math.pow(2, height) - 1];
        completeBinaryTreeToArray(root, arr, 0);
        return arr;
    }

    private static void completeBinaryTreeToArray(TreeNode root, int[] arr, int index) {
        if (root == null) {
            return;
        }

        arr[index] = root.val;
        completeBinaryTreeToArray(root.left, arr, 2 * index + 1);
        completeBinaryTreeToArray(root.right, arr, 2 * index + 2);
    }

    private static int getHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return 1 + Math.max(getHeight(root.left), getHeight(root.right));
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6};

        TreeNode root = arrayToCompleteBinaryTree(arr);

        int[] result = completeBinaryTreeToArray(root);
        for (int num : result) {
            System.out.print(num + " ");
        }
    }
}

满二叉树

定义

  • 满二叉树是一种更加特殊的完全二叉树,具有以下特点:
代码语言:txt
复制
1、所有层的节点都被填满。
2、满二叉树的高度是固定的,由节点数量决定。

高度为 H 满二叉树节点个数 N:
N = 2^0 + 2^1 + 2^2 + ... + 2^H = 2^H - 1 

数组和满二叉树转换

  • 满二叉树是一棵特殊的完全二叉树,因此实现方式和完全二叉树相同。

总结

树高度

  • 完全二叉树的高度通常较小,但不确定,取决于节点数量。
  • 满二叉树的高度由节点数量决定,是确定的。

应用场景

  • 完全二叉树在堆数据结构中广泛应用,如二叉最小堆和二叉最大堆。
  • 满二叉树在一些特定的数据存储和检索算法中有用,但相对较少见。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 完全二叉树
    • 定义
      • 数组和完全二叉树转换
        • 数组转完全二叉树
        • 完全二叉树转数组
        • Java 版实现
    • 满二叉树
      • 定义
        • 数组和满二叉树转换
        • 总结
          • 树高度
            • 应用场景
            • 个人简介
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档