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

  • hello,大家好,我是 Lorin ,首先祝大家双节快乐,这篇文章也是放假前的最后一篇文章,祝大家食用愉快,有所收获。

引言

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

完全二叉树

1696039022873.png

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

定义

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

数组和完全二叉树转换

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

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

数组转完全二叉树

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

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

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

完全二叉树转数组

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

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 + " ");
        }
    }
}

满二叉树

1696039048180.png

定义

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

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

数组和满二叉树转换

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

总结

树高度

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

应用场景

  • 完全二叉树在堆数据结构中广泛应用,如二叉最小堆和二叉最大堆。
  • 满二叉树在一些特定的数据存储和检索算法中有用,但相对较少见。
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lorin 洛林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值