【c语言数据结构】二叉树

c语言数据结构完全二叉树

快速开始

直接参考示例代码即可

介绍

概念

二叉树(Binary tree)是树形结构的一个重要类型。

许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,

二叉树的存储结构及其算法都较为简单。

二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

类型

基本类型描述
空二叉树(NULL)
二叉树根只有一个节点的二叉树
左树每个结点只有左子节点的树(链表)
右树每个节点只有右子节点的树
完全二叉树每个深度都是满节点的二叉树

示例代码:建立二叉树

介绍

  • 该示例代码介绍了一个完全二叉树的建立,以及前序遍历,中序遍历和后序遍历的索引结果。(源代码完成了命名自注释,不再赘述)

  • 头文件建立了一个DH_ibtree的二叉树类型,核心数据是data,核心接口是data_info

代码结构

代码结构:
- ./|-- DH_btree.h-- DH_basic_btree.c

DH_btree.h

/** copyright DH.*/#ifndef DH_BTREE
#define DH_BTREE/* 标识,说明该参数是入参还是出参 */
#define IN
#define OUT
#define INOUT
/* 数据结构为整型的基本二叉树示例 */
typedef struct _DH_ibtree {int data;int deep;void (*data_info)(int data);struct _DH_ibtree *left;struct _DH_ibtree *right;
} DH_ibtree;#endif

DH_basic_btree.c

#include <stdio.h>
#include <stdlib.h>
#include "DH_btree.h"static void logDataInfo(int data)
{printf("[当前节点信息] 节点数据 = %d\n", data);
}/* 利用前序遍历完成二叉树构建 */
static void preOrderSetUp(IN int *tree_arr, IN int arr_len,INOUT DH_ibtree *father_node,IN int father_node_index)
{if (father_node == NULL) {return;}if (father_node_index > arr_len) {return;}if (father_node_index * 2 > arr_len) {return;}father_node->left = (DH_ibtree *)calloc(1, sizeof(DH_ibtree));father_node->left->data = tree_arr[father_node_index * 2 -1];father_node->left->data_info = logDataInfo;// printf("%d\n", tree_arr[father_node_index * 2 -1]);preOrderSetUp(tree_arr, arr_len, father_node->left, father_node_index * 2);father_node->right = (DH_ibtree *)calloc(1, sizeof(DH_ibtree));father_node->right->data = tree_arr[father_node_index * 2];father_node->right->data_info = logDataInfo;// printf("%d\n", tree_arr[father_node_index * 2]);preOrderSetUp(tree_arr, arr_len, father_node->right, father_node_index * 2 + 1);    
}/** 功能:前序遍历初始化一个二叉树* 输入:原始二叉树数组,二叉树数组大小* 输出:无* 返回:初始化的二叉树*/
DH_ibtree *DH_ibtree_init(IN int *tree_arr, IN int arr_len)
{DH_ibtree *new_tree = (DH_ibtree *)calloc(1, sizeof(DH_ibtree));new_tree->data = tree_arr[0];new_tree->data_info = logDataInfo;preOrderSetUp(tree_arr, arr_len, new_tree, 1);return new_tree;
}/** 功能:二叉树前序遍历****/
void DH_ibtree_preOrderLoop(IN DH_ibtree *node)
{if (!node) {return;}node->data_info(node->data);DH_ibtree_preOrderLoop(node->left);DH_ibtree_preOrderLoop(node->right);
}/** 功能:二叉树中序遍历****/
void DH_ibtree_inOrderLoop(IN DH_ibtree *node)
{if (!node) {return;}DH_ibtree_inOrderLoop(node->left);node->data_info(node->data);DH_ibtree_inOrderLoop(node->right);
}/** 功能:二叉树后序遍历****/
void DH_ibtree_postOrderLoop(IN DH_ibtree *node)
{if (!node) {return;}DH_ibtree_postOrderLoop(node->left);DH_ibtree_postOrderLoop(node->right);node->data_info(node->data);
}int main(void)
{int arr[7] = {1, 2, 3, 4, 5, 6, 7};int arr_num = 7;DH_ibtree *tree = DH_ibtree_init(arr, arr_num);printf("preOrderLoop start\n");DH_ibtree_preOrderLoop(tree);printf("inOrderLoop start\n");DH_ibtree_inOrderLoop(tree);printf("postOrderLoop start\n");DH_ibtree_postOrderLoop(tree);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git 指令全集

git 指令全集 指令集参考这里&#xff0c;后续会继续整理 https://www.runoob.com/git/git-tutorial.html 基本使用流程 场景&#xff11;&#xff1a;建立新仓 首先在本地新建一个仓 ~$ mkdir git_workspace ~$ git init与远程仓建立连接 # 查看所有的远端分支 -$ git rem…

UTHash使用教程

UTHash使用教程 快速入门 想快速入门该模块请访问&#xff1a;介绍&#xff0c;数据接口&#xff0c;示例代码 介绍 Hash &#xff1a;散列&#xff0c;通过关于键值(key)的函数&#xff0c;将数据映射到内存存储中一个位置来访问。这个过程叫做Hash&#xff0c;这个映射函…

【C语言基础】gdb调试工具的使用

gdb调试教程 快速入门 要想快速入门gdb调试&#xff0c;可以直接翻阅基本案例&#xff1a;采内存 介绍 GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c程序员&#xff0c;gdb是必不可少的工具 …

C/C++队列与循环队列

C/C数据结构 - 队列 循环队列 快速入门 介绍 1. 队列的定义 队列是一种线性存储结构&#xff0c;每次对队列的增删操作如下 增&#xff1a;在队列尾部添加元素 删&#xff08;取出&#xff09;&#xff1a;在队列头部删除元素 这种数据存储方式遵循“先进先出”&#xff0…

PyQt特殊对话框介绍

PyQt特殊对话框 对话框基类&#xff1a;QDialog 对话框基本用法&#xff1a; 模态窗口&#xff1a; 当窗口设置为模态窗口时&#xff0c;不能对其父级别的窗口进行操作。QTdesigner里有控件可以勾选Func: QtWidgets.Dialog.setModal(True) [ True | False ] 窗口执行 exec&am…

PyQt5 让窗口在桌面居中的办法

屏幕居中核心函数 在我们开发的UI类中定义一个center方法&#xff0c;&#xff08;方法名自定&#xff0c;内容如下&#xff09;。其中QDesktopWideget方法在Qtwidgets头文件中。 然后在 __init__()中调用该 self.center()方法即可。 # 屏幕居中def center(self):# 获取窗口大…

PyQt5 QLineEdit输入密码

单行编辑器 QLineEdit 输入密码 单行编辑器直接继承于QWidget 常用方法&#xff1a; 设置显示模式&#xff1a;在设置密码栏常会使用这种模式 方法QLineEdit.setEchoMode 用法 假设你有一个QLineEdit()组件 self.UserpswdEdit QLineEdit()则你可以使用下面三种方式定义输…

Arduino 软件开发(一): GPIO读写

Arduino 软件开发&#xff08;一&#xff09; 目录 核心运行函数&#xff0c; 基础语法&#xff0c;数字控制&#xff0c;模拟控制 核心运行函数 void setup() 当Arduino程序开始运行时会调用setup()函数。通常setup()函数完成初始化一些变量、配置引脚状态及初始化调用的库…

JavaScript学习笔记:类与导包实例

NodeJS类与导包 在工程上&#xff0c;一个文件就是一个独立的模块&#xff0c;仅包含一个类。我们可以称之为类文件。因此当我们要使用这个模块的时候&#xff0c;我们会将这个类文件作为一个包导入到调用的文件里。方法如下&#xff1a; 0. 目录结构如下 - src|__ main.js|…

JavaScript学习笔记:常量,枚举,宏定义

NodeJS常量&#xff08;fake&#xff1a;宏定义&#xff09; 因为之前C/C代码开发习惯了&#xff0c;会用到一些宏定义来替换一些表意不明的数字&#xff08;就是含义不清的数字&#xff09;。而JS没有这种宏定义。上网找到一个链接作为参考&#xff1a;https://www.itranslat…

JavaScript学习笔记:函数与箭头函数

NodeJS函数 由于js是弱语言&#xff0c;因此&#xff0c;函数的入参和出参可以为任意形式而不用指定类型。当然也没有办法使用冒号的形式进行参数类型注释。但是typescript可以使用冒号形式进行参数类型注释。 1. 普通的函数定义 不带参数形式printHello带参数形式plus使用re…

Python学习笔记(1):用户输入,终端输入

#用户输入&#xff0c;操作 print("python 用户输入操作")# input(提示字符串)&#xff0c;函数阻塞程序&#xff0c;并提醒用户输入字符串 instr input("please input the string: ") print("input >> " instr)# 将输入的字符串转化成整…

Python学习笔记(2):生成器

介绍 我们可以通过列表生成式简单直接地创建一个列表&#xff0c;但是受到内存限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#xff0c;而且如果我们仅仅需要访问前面几个元素&#xff0c;那后面…

Python学习笔记(3):zipfile解压库

简介 python自带zipfile解压库&#xff0c;导入方式如下 import zipfile批量解压 先尝试无密码解压&#xff0c;如果失败&#xff0c;就输入密码。但是zipfile解压大文件速度很慢。 path rL:/resource/zipPackage passwd b123456 def compressFromZip():for temp_name in…

数字万用表使用方法

数字万用表使用方法 简介&#xff1a;数字万用表相对来说&#xff0c;属于比较简单的测量仪器。本篇&#xff0c;作者就教大家数字万用表的正确使用方法。从数字万用表的电压、电阻、电流、二极管、三极管、MOS场效应管的测量等测量方法开始&#xff0c;让你更好的掌握万用表测…

Python学习笔记(4):Python如何设置类似C语言静态函数

介绍 模块封装时候&#xff0c;希望有一些函数不被外部直接调用。C语言通常采用static int function()形式以及头文件形式作为标识。而python不存在头文件&#xff0c;但可以通过修饰符staticmethod进行代替。 staticmethod def your_function():# 你的代码print("your …

c++ 字符串相等比较

介绍 在C 中比较字符串的技术 (Techniques to Compare Strings in C) Strings in C can be compared using either of the following techniques: 可以使用以下两种技术之一来比较C 中的字符串&#xff1a; String strcmp() function 字符串strcmp&#xff08;&#xff09;函…

ffmpeg下载安装 多段ts视频m3u8下载

如何下载多段ts视频 m3u8 ffmpeg ffmpeg使用教程 下载 Windows下载方法 step1. 官网下载地址 点此进入下载地址 step2. 选择 Windows EXE files 中的Windows builds by BtbN 这会跳转到github页面中。 step3. 选择对应的linux平台或者windows平台进行下载 安装 step1.…

linux环境下安装多个任意版本的python环境

linux环境下安装多个任意版本的python环境 安装方法可以归结为 [下载 编译 配置环境变量] 下载Python 参考链接&#xff1a; .任意python版本下载&#xff0c;所有python版本下载的FTP路径 Windows下载发送到linux上 step1. 下载linux版本的python 从Python官网进入 选择…

linux云服务器状态上报解决方案:外发个人邮箱

linux云服务器状态上报解决方案&#xff1a;外发个人邮箱 需求如下&#xff1a; #### 将一些服务器的关键日志实时发送到手机上一些案例&#xff1a; CPU状态检测 解决方案&#xff1a; #### 利用mailx命令外发邮件方法如下&#xff1a; 1. 用管理员打开mail配置文件 >…