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

yizhihongxing

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日

相关文章

  • Linux初学者总结分享

    Linux初学者总结分享 为什么需要学习Linux Linux是一种自由开放源代码的操作系统,具有高度的安全性、安装简单、稳定性好的特点,且被广泛应用于服务器、超级计算机、智能手机等领域。学习Linux不仅可以提高以及完善自己的计算机技能,同时可以大幅度提高工作效率、更好地掌控计算机,成为技术大牛的必经之路。 Linux基本操作 查看当前目录下文件和文件夹 …

    other 2023年6月27日
    00
  • URL目录文件名优化过程中的14大技巧

    下面我将为您详细讲解“URL目录文件名优化过程中的14大技巧”的完整攻略。 1. 表示层URL与实际URL分开 将网站的URL分成两部分,表示层URL和实际URL。表示层URL用于展示和用户访问,实际URL则用于服务器访问和处理。 示例说明:例如,网站的表示层URL为:https://www.example.com/article/123,而实际URL为:h…

    other 2023年6月26日
    00
  • BJDCTF 2nd web

    BJDCTF 2nd web是一场网络安全比赛中的一道Web题目,本文将提供完整攻略,包括题目分析、解题思路和具体实现方法,并提供两个示例说明。 题目分析 题目描述:给定一个网站,其中包含一个登录页面和一个用户信息页面。用户需要在登录页面输入正确的用户名和密码才能进入用户信息页面。但是,该网站存在一个漏洞,可以通过绕过登录验证来直接访问用户信息页面。 解题思…

    other 2023年5月5日
    00
  • VisualStudio页面怎么使用控件?

    要在VisualStudio中使用控件,可以按照以下步骤操作: 步骤1:打开工具箱 在VisualStudio中,可以通过在菜单栏中选择“View” -> “Toolbox”,或者按下快捷键Ctrl + Alt + X,来打开工具箱。 步骤2:选择控件 在工具箱中,可以看到各种可用的控件。可以直接使用工具箱中默认提供的控件,也可以自行添加自己编写的控件…

    other 2023年6月27日
    00
  • Microsoft VBScript 编译器错误 错误原因 代码大全

    Microsoft VBScript 编译器错误指的是使用VBScript语言编写的代码在编译运行过程中出现的异常情况。以下是错误原因和代码大全: 错误原因 1.语法错误:VBScript脚本语言非常严格,语法错误包括变量拼写错误、语句缺失、不完整的括号等。 2.类型不匹配:VBScript是一种弱类型语言,这意味着如果变量的值和使用的对象类型不一致,会导致…

    other 2023年6月26日
    00
  • 在Windows中配置Rsync同步文件的方法

    接下来我将为你详细讲解如何在 Windows 中配置 Rsync 同步文件的方法。以下是完整攻略: 安装 Rsync 步骤1:下载 Cygwin 首先需要下载 Cygwin,它是一个运行在 Windows 上的类 Unix 环境,Rsync 就是运行在 Cygwin 环境中的。 下载地址:https://cygwin.com/install.html 步骤2…

    other 2023年6月25日
    00
  • 如何在 Illustrator 中使用图层 ai图层使用教程

    如何在 Illustrator 中使用图层 在 Adobe Illustrator 中,图层是组织和管理设计元素的重要工具。以下是使用图层的详细攻略: 创建图层 打开 Adobe Illustrator,并打开您的设计文件。 在右侧的“图层”面板中,点击底部的“新建图层”按钮(图标为一个方形和一个加号)。 输入图层的名称,并按下回车键创建图层。 图层的可见性…

    other 2023年10月15日
    00
  • dos批量替换当前目录后缀名的实现代码

    DOS批量替换当前目录后缀名的实现代码攻略 1. 确定需求 首先,我们需要明确我们的需求是批量替换当前目录下所有文件的后缀名。假设我们要将所有的.txt文件替换为.md文件。 2. 编写批处理脚本 接下来,我们可以使用DOS批处理脚本来实现这个功能。下面是一个示例的批处理脚本代码: @echo off setlocal enabledelayedexpans…

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