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数组的指针来逆序访问数组元素,在递归过程中动态获取节点的数据。

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

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

相关文章

  • C语言中的常量详解

    C语言中的常量详解 常量是指在程序中不可以被改变的值,C语言中有很多种类型的常量,本文将对常量进行详细介绍,包括常量的类型、定义常量的方法以及使用常量的注意事项。 常量的类型 C语言中常量的类型有如下几种: 整型常量:整型常量就是整数常量,可以是十进制、八进制或十六进制表示。 实型常量:实型常量也就是浮点型常量,包括单精度浮点型和双精度浮点型。例如:3.14…

    other 2023年6月27日
    00
  • js十六进制转字符串

    以下是JavaScript中将十六进制转换为字符串的完整攻略: 步骤1:获取十六进制值 首先,需要获取十六进制值。可以从输入框、变量或其他来源获取十六进制值。以下是从输入框获取十六进制值的示例代码: const hexValue = document.getElementById(‘hex-input’).value; 上述代码获取了id为“hex-inpu…

    other 2023年5月6日
    00
  • webpack 4 简单介绍

    Webpack 4 简单介绍 Webpack是一个现代化的JavaScript应用程序的静态模块打包器。它将多个模块打包成一个或多个bundle,以便在浏览器中加载。Webpack 4是Webpack的最新版本,它提供了更好的性能和更好的开发体验。本文将简单介绍Webpack 4的基本概念、使用方法和示例说明。 Webpack 4的基本概念 Webpack …

    other 2023年5月5日
    00
  • JavaScript中数组的各种操作的总结(必看篇)

    JavaScript中数组的各种操作的总结 在JavaScript中,数组是一种非常常见的数据类型。本文将总结一些常见的数组操作。 定义一个数组 可以使用两种方式来定义一个数组。 第一种方法是使用方括号 []: let arr1 = []; // 声明一个空数组 let arr2 = [1, 2, 3]; // 声明一个3个元素的数组,包含数字1,2,3 l…

    other 2023年6月25日
    00
  • 魔兽世界怀旧服狂暴战输出循环怎么样 狂暴战PVE手法分享

    魔兽世界怀旧服狂暴战输出循环怎么样 – 狂暴战PVE手法分享 狂暴战PVE输出循环 狂暴战的PVE输出循环可以分为两个阶段:暴饮暴食和食指扫射。下面我们来详细讲解这两个阶段的循环: 暴饮暴食阶段 在暴饮暴食阶段,你需要先进行冲锋,然后使用图腾破,接着使用斩杀,这样能够让你尽快进入狂怒模式。在狂怒模式下,你需要保持暴击率尽可能高,所以在能够的情况下优先选择暴击…

    other 2023年6月27日
    00
  • gps坐标(wgs84)转换百度坐标(bd09)python测试

    GPS坐标(WGS84)转换百度坐标(BD09) Python测试 在开发中,我们通常会需要把GPS坐标转换成百度坐标,以便在地图上正确的标注位置信息。本文将介绍如何使用Python实现GPS坐标(WGS84)转换成百度坐标(BD09)的功能。 1. 安装Python第三方库 我们需要安装geohash2和geopy这两个Python库,方便进行坐标转换和计…

    其他 2023年3月28日
    00
  • mysql之slowlog慢查询日志

    mysql之slowlog慢查询日志 MySQL是目前广泛使用的关系型数据库管理系统之一,但是在处理大量数据时,会出现慢查询的情况,导致数据库性能下降,影响网站的正常运行。MySQL提供了一个慢查询日志机制,用于记录慢查询的SQL语句,可以通过分析慢查询日志找出性能瓶颈并进行优化。 开启慢查询日志 要开启MySQL的慢查询日志,需要在MySQL服务器配置文件…

    其他 2023年3月28日
    00
  • 什么是开源软件?

    开源软件是指代码完全公开,任何人可以查看、复制、修改、发布的软件。开源软件推崇开放、透明、合作的精神,从而汇聚更广泛的开发者和用户参与软件的开发和维护。开源软件也因此成为了当前互联网发展的重要支撑系统。 在这里,我将为大家详细讲解什么是开源软件的完整攻略,过程中将会展示至少两个代码示例。 步骤一:了解开源软件 了解什么是开源软件是很重要的一步。开源软件的主要…

    其他 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部