C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树

C语言数据结构系列篇:二叉树的概念及满二叉树与完全二叉树

一、二叉树的概念

二叉树是一种特殊的树型结构,它的每个节点最多有两个子节点,称为左子节点和右子节点。二叉树可以为空树,也可以是非空树。二叉树的每个节点保存着某种数据,可以是整数、浮点数、字符串等。

下图是一个简单的二叉树示例:

    1
   / \
  2   3
     / \
    4   5

其中,数字表示节点保存的数据。根节点是1,左子节点是2,右子节点是3,3节点的左子节点是4,右子节点是5。

二、满二叉树

满二叉树是一种特殊的二叉树,它的所有非叶子节点都有两个子节点,并且所有叶子节点都在同一层。也就是说,除了最后一层,其它层数的节点个数都是满的,最后一层的节点全部靠左排列。

下图是一个满二叉树示例:

        1
      /   \
     2     3
    / \   / \
   4   5 6   7

该满二叉树共有7个节点,它们的数据分别是1、2、3、4、5、6、7。

三、完全二叉树

完全二叉树也是一种特殊的二叉树,它除了最后一层之外,其它层的节点都是满的,最后一层的节点都靠左排列。与满二叉树不同的是,完全二叉树的节点个数不一定是满的。

下图是一个完全二叉树示例:

        1
      /   \
     2     3
    / \   / 
   4   5 6   

该完全二叉树共有6个节点,它们的数据分别是1、2、3、4、5、6。由于最后一层缺少一个节点,因此它不是满二叉树,而是完全二叉树。

四、示例说明

下面是一个满二叉树的示例程序:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    int data;  //节点保存的数据
    struct TreeNode *left;  //左子节点
    struct TreeNode *right;  //右子节点
} TreeNode, *BinaryTree;

//递归创建满二叉树
BinaryTree createFullBinaryTree(int depth) {
    if (depth == 0) {
        return NULL;
    }
    BinaryTree tree = (BinaryTree)malloc(sizeof(TreeNode));
    if (tree == NULL) {
        return NULL;
    }
    tree->data = depth;
    tree->left = createFullBinaryTree(depth - 1);
    tree->right = createFullBinaryTree(depth - 1);
    return tree;
}

//前序遍历二叉树
void preOrderTraversal(BinaryTree tree) {
    if (tree != NULL) {
        printf("%d ", tree->data);
        preOrderTraversal(tree->left);
        preOrderTraversal(tree->right);
    }
}

int main() {
    BinaryTree tree = createFullBinaryTree(3);
    preOrderTraversal(tree);  //输出结果:1 2 4 5 3 6 7
    return 0;
}

这个程序使用递归方式创建了一个深度为3的满二叉树,并进行了前序遍历。前序遍历的输出结果为1 2 4 5 3 6 7,与满二叉树的数据对应。

下面是一个完全二叉树的示例程序:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    int data;  //节点保存的数据
    struct TreeNode *left;  //左子节点
    struct TreeNode *right;  //右子节点
} TreeNode, *BinaryTree;

//递归创建完全二叉树
BinaryTree createCompleteBinaryTree(int depth, int current, int *data) {
    if (current > depth || *data < 1) {
        return NULL;
    }
    BinaryTree tree = (BinaryTree)malloc(sizeof(TreeNode));
    if (tree == NULL) {
        return NULL;
    }
    tree->data = *data--;
    tree->left = createCompleteBinaryTree(depth, current + 1, data);
    tree->right = createCompleteBinaryTree(depth, current + 1, data);
    return tree;
}

//前序遍历二叉树
void preOrderTraversal(BinaryTree tree) {
    if (tree != NULL) {
        printf("%d ", tree->data);
        preOrderTraversal(tree->left);
        preOrderTraversal(tree->right);
    }
}

int main() {
    int data[] = {1, 2, 3, 4, 5, 6};
    BinaryTree tree = createCompleteBinaryTree(3, 1, &data[5]);
    preOrderTraversal(tree);  //输出结果:1 2 4 5 3 6
    return 0;
}

这个程序使用递归方式创建了一个深度为3的完全二叉树,并进行了前序遍历。前序遍历的输出结果为1 2 4 5 3 6,与完全二叉树的数据对应。注意,这个程序使用了指向data数组的指针来逆序访问数组元素,在递归过程中动态获取节点的数据。

阅读剩余 66%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • win8虚拟光驱右键找不到装载该怎么办?

    针对“win8虚拟光驱右键找不到装载该怎么办?”这个问题,我提供如下完整攻略: 1. 确认虚拟光驱是否正常安装 首先,需要确认虚拟光驱是否已经正常安装。在Windows 8系统中,可以通过电脑“设备管理器”查看设备状态。如果虚拟光驱的状态是正常的,那么就可以排除设备驱动问题。 2. 确认虚拟光驱映像文件是否存在 如果虚拟光驱已经正常安装,那么可能是因为虚拟光…

    other 2023年6月27日
    00
  • MySQL字符编码设置方法

    MySQL字符编码设置方法 字符编码(Character Encoding)在数据库中是一个非常重要的配置项。它负责将实际存储在数据库中的二进制数据(如字符串)转换为可读的文本形式,并且也能决定如何存储和比较文本。 MySQL支持多种字符编码,包括Unicode、ASCII、UTF8等。正确设置MySQL字符编码是确保数据在数据库中正确存储和显示的关键。在下…

    other 2023年6月25日
    00
  • devicenotfound解决方案

    devicenotfound解决方案 当我们连接Android设备到电脑时,有时候会遇到设备未被识别的问题,常见的错误信息是”devicenotfound”,这种问题常常会导致我们无法在电脑上调试或传输文件。在这篇文章中,我将为您讲解一些解决”devicenotfound”问题的方法。 确认设备已启用开发者选项 为了在电脑上调试或传输文件,我们需要先在安卓设…

    其他 2023年3月29日
    00
  • 第1节kafka消息队列:3、4、kafka的安装以及命令行的管理

    Kafka消息队列的安装和命令行管理 Kafka是一种高吞吐量的分布式消息队列,它可以处理大量的数据流。本文提供一份关于Kafka的安装以及命令行的管理的完整攻略,包括如何安装Kafka、如何启动Kafka、如何创建主题和如何使用Kafka命令行工具。 步骤1:安装Kafka 要开始使用Kafka需要先安装它。可以从以下网址下载Kafka: https://…

    other 2023年5月9日
    00
  • C++中函数模板的用法详细解析

    C++中函数模板的用法详细解析 什么是函数模板? 函数模板是一种通用的函数定义,可以接受不同类型的参数,从而可以在不需要多次定义函数的情况下处理不同的数据类型。 如何定义函数模板? 函数模板的语法格式如下: template <typename T> 函数返回类型 函数名(参数列表) { 函数体 } 其中,typename T 表示定义一个类型 …

    other 2023年6月26日
    00
  • Win10创意者更新15063.413(version 1703)各版本官方镜像下载地址 32位/64位

    Win10创意者更新15063.413(version 1703)各版本官方镜像下载地址 32位/64位攻略 Win10创意者更新15063.413是Windows 10的一个版本,也被称为版本1703。在本攻略中,我将为您提供Win10创意者更新15063.413各版本的官方镜像下载地址,并提供两个示例说明。 下载地址 您可以从以下来源获取Win10创意者…

    other 2023年8月5日
    00
  • java入门:基础算法之二进制转换为十进制

    Java入门:基础算法之二进制转换为十进制 在Java编程中,经常需要进行二进制和十进制之间的转换。本文将介绍如何将二进制转换为十进制,并提供两个示例说明,以帮助您更好地理解和应用这些技术。 二进制转换为十进制的方法 将进制转换为十进制的方法是将每个二进制位乘以2的幂次方,然后将结果相加。例如,二进制数1011转换为十进制数的计算方法如下: 1*2^3 + …

    other 2023年5月7日
    00
  • 解决python selenium3启动不了firefox的问题

    针对”解决Python Selenium3启动不了Firefox的问题”这个问题,我可以给你提供以下完整攻略: 问题背景 在使用Python中的Selenium3来启动Firefox浏览器时,有时候会遇到无法成功启动浏览器的情况。 解决方案 一般来说,无法启动Firefox浏览器的问题主要有两种可能性: Firefox浏览器的版本与Selenium3的驱动版…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部