二叉树(C语言实现)——链式存储结构

2023-05-16

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define QueueSize 200
typedef char DataType;
typedef struct TNode
{
	DataType data;
	struct TNode* lchild;
	struct TNode* rchild;

}BiTree;

BiTree* Creat_Tree();						//	创建树 	
DataType Get_Root(BiTree * root);			//	返回根结点 
int Depth_BiTree(BiTree * root);			//	树深度 
int Count_BiTree(BiTree * root);			//	树结点数 
int LeafCount_BiTree(BiTree * root);		//	树叶子结点数 
void PreOrder_Traverse(BiTree * root);		//	前序遍历 
void InOrder_Traverse(BiTree * root);		//	中序遍历 
void PostOrder_Traverse(BiTree * root);		//	后序遍历
void LevelOrder_Traverse(BiTree * root);	//	层序遍历
bool Destroy_Tree(BiTree * root);			//	销毁树 

int main()
{
	BiTree * root = Creat_Tree();
		
	printf("根结点:%c\n",Get_Root(root));
	printf("树深度:%d\n",Depth_BiTree(root));
	printf("树结点数:%d\n",Count_BiTree(root));
	printf("树叶子结点数:%d\n",LeafCount_BiTree(root));
		
	printf("先序遍历:");
	PreOrder_Traverse(root);
	printf("\n");
	 
	printf("中序遍历:"); 
	InOrder_Traverse(root);
	printf("\n");
	
	printf("后序遍历:");
	PostOrder_Traverse(root);
	printf("\n");
	
	printf("层序遍历:");
	LevelOrder_Traverse(root);
	printf("\n");
	
	if(Destroy_Tree(root))
		printf("销毁成功!\n");
	else
		printf("销毁失败!\n");
	
	return 0; 
} 

BiTree* Creat_Tree()
{
	//	创建结点 
	BiTree * pA = (BiTree*)malloc(sizeof(BiTree)); 
	BiTree * pB = (BiTree*)malloc(sizeof(BiTree)); 
	BiTree * pC = (BiTree*)malloc(sizeof(BiTree)); 
	BiTree * pD = (BiTree*)malloc(sizeof(BiTree)); 
	BiTree * pE = (BiTree*)malloc(sizeof(BiTree)); 
	
	//	给结点赋值 
	pA->data = 'A'; 
	pB->data = 'B'; 
	pC->data = 'C'; 
	pD->data = 'D'; 
	pE->data = 'E'; 
	
	// 构建左右子树
	pA->lchild = pB;
	pA->rchild = pC;
	
	pB->lchild = pD;
	pB->rchild = NULL;
	
	pC->lchild = NULL;
	pC->rchild = pE;
	
	pD->lchild = NULL;
	pD->rchild = NULL;
	
	pE->lchild = NULL;
	pE->rchild = NULL;
	
	return pA;	//	返回根结点的地址 
}

DataType Get_Root(BiTree * root)
{
	return root->data;
}

int Depth_BiTree(BiTree * root)
{
	if(!root)
		return 0;
	
	return Depth_BiTree(root->lchild) > Depth_BiTree(root->rchild) ? Depth_BiTree(root->lchild)+1 : Depth_BiTree(root->rchild)+1;
	//	深度:最大层数 + 1 
}

int Count_BiTree(BiTree * root)
{
	if(!root)
		return 0;
		
	return Count_BiTree(root->lchild) + Count_BiTree(root->rchild) + 1;//	树结点数:左子树结点 + 右子树结点+ 根结点 
}

int LeafCount_BiTree(BiTree * root)
{
	if(!root)
		return 0;
		
	if(!root->lchild && !root->rchild)	//	左、右指针域均为空,为叶子结点 
		return 1;
	else
		return LeafCount_BiTree(root->lchild) + LeafCount_BiTree(root->rchild);	//	递归遍历左、右子树叶子结点 
}

/*
 *	伪算法:
 *	先访问根节点
 *	再先序访问左子树
 *	再线序访问右子树
 */
void PreOrder_Traverse(BiTree * root)
{
	if(!root)
		return;
	else
	{
		printf("%2c", root->data);
		PreOrder_Traverse(root->lchild);
		PreOrder_Traverse(root->rchild);
	}
}

void InOrder_Traverse(BiTree * root)
{
	if(!root)
		return;
	else
	{
		InOrder_Traverse(root->lchild);		
		printf("%2c", root->data);
		InOrder_Traverse(root->rchild);
	}
}

void PostOrder_Traverse(BiTree * root)
{
	if(!root)
		return;
	else
	{	
		PostOrder_Traverse(root->lchild);
		PostOrder_Traverse(root->rchild);
		printf("%2c", root->data);
	}

}

void LevelOrder_Traverse(BiTree * root)
{
	//	建一个队列并初始化队头、队尾指针 
	BiTree* Queue[QueueSize];
	int front = 0;
	int rear = 0;
	
	//	如果根结点不为空,则将根结点入队
	if(root!=NULL)
		Queue[rear++] = root; 
	 
	while(front!=rear)	//	队列不为空
	{
		BiTree * ch = Queue[front++]; 
		printf("%2c", ch->data);
		
	//	将原结点的左、右子树结点入队 
		if(ch->lchild!=NULL)
			Queue[rear++] = ch->lchild;
		
		if(ch->rchild!=NULL)
			Queue[rear++] = ch->rchild;
	} 
}

bool Destroy_Tree(BiTree * root)
{
	if(!root)
		return false;
	
	Destroy_Tree(root->lchild);	//	先销毁左子树 
	Destroy_Tree(root->rchild);	//	再销毁右子树 
	free(root);					//	释放根结点 
	root = NULL; 				//	防止产生野指针 
	return true;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树(C语言实现)——链式存储结构 的相关文章

  • C语言寄存器变量register

    用register声明的变量是寄存器变量 xff0c 是存放在CPU的寄存器里的 而我们平时声明的变量是存放在内存中的 虽说内存的速度已经很快了 xff0c 不过跟寄存器比起来还是差得远 寄存器变量和普通变量比起来速度上的差异很大 xff0
  • Curl(C++)使用教程

    1 Curl简介 2 Easy interface 3 Multi interface 1 Curl简介 libcurl作为是一个多协议的便于客户端使用的URL传输库 xff0c 基于C语言 xff0c 提供C语言的API接口 xff0c
  • GPS原始RMC数据解析之DDMM.MMMM

    环境 GPS BD 定位模块 1 模块输出数据如下 GNRMC 100756 000 V 4000 0005 N 11559 9745 E 6 21 223 00 050313 N 68 2 了解换算规则 ddmm mmmm规则和dd dd
  • VINS-Mono代码阅读笔记(三):vins_estimator中main函数分析

    在VINS Mono代码阅读笔记 xff08 一 xff09 xff1a 从Euroc数据集的运行开始 中我们已经初步知道了vins estimator中订阅和发布的topic xff0c 那么 xff0c 在研究vins estimato
  • VINS-Mono代码阅读笔记(十三):posegraph中四自由度位姿优化

    本篇笔记紧接着VINS Mono代码阅读笔记 xff08 十二 xff09 xff1a 将关键帧加入位姿图当中 xff0c 来学习pose graph当中的紧耦合优化部分 在重定位完成之后 xff0c 进行位姿图优化是为了将已经产生的所有位
  • VINS-Mono代码阅读笔记(十四):posegraph的存储和加载

    本篇笔记紧接着VINS Mono代码阅读笔记 xff08 十三 xff09 xff1a posegraph中四自由度位姿优化 xff0c 来分析位姿图的存储和加载 完整 xff08 也是理想的 xff09 的SLAM的使用应该是这样的 xf
  • Visual Studio中设置opencv环境

    图像处理的项目中 xff0c 每建立一个新的项目 xff0c 需要对环境重新设置 xff0c 本文记录一下自己在VS中设置环境的步骤 xff0c 也分享给相同的入门小白 本文侧重说明VS中调用opencv的环境设置步骤 xff0c open
  • STM32学习笔记(1)---工程创建

    文章目录 前言一 新建工程步骤1 点击Project gt New uVision Project2 选择芯片3 创建文件夹4 放入必要文件4 头文件关联 总结问题 前言 这是我第一次写博客 xff0c 而且对于STM32也只是初学 xff
  • 乌班图安装 Kalibr

    安装ROS Melodic 1 Installation 1 1 Configure your Ubuntu repositories http www 360doc com content 18 0417 15 54525756 7463
  • ubuntu16.04 安装 php7.0-curl

    sudo apt add repository ppa ondrej php 添加这个源 sudo apt get update sudo apt get install php7 0 curl 这时成功安装php7 0 curl
  • string、char *、char[] 相互转换转换

    点击打开原文链接 一 string 转 char 主要有三种方法可以将 str 转换为 char 类型 xff0c 分别是 xff1a data c str copy 1 data 方法 xff1a string str 61 34 hel
  • STM32F103标准库开发---Uart串口通信实验---函数发送和中断接收

    STM32F103标准库开发 目录 文章目录 一 Uart串口通信 函数发送 1 Uart串口发送 标准库 函数 单字节发送 2 Uart串口检测标志 标准库 函数 3 Uart串口函数发送具体程序 二 Uart串口通信 中断接收 1 Ua
  • Keil5----新建项目文件( .c文件 和 .h文件)

    前言 在使用 Keil5 编辑程序的时候 xff0c 一定需要新建几个文件 xff08 c文件 和 h文件 xff09 xff0c 在其中编写不同功能的程序 例如 xff1a 新建LED c和LED h文件 xff0c 实现LED灯闪烁的功
  • 编码和串口通信

    先了解字符串和bytes xff08 字节 xff09 字符串 xff1a python里的字符串就是文本 xff0c 用于与人类交互 xff0c 像这样 xff1a 阿拉伯数字 xff1a a 61 1234566454 英语 xff1a
  • vscode终端不显示,闪退问题解决(完整步骤)

    1 以管理员身份运行此程序 步骤 xff1a 1 1 找到该文件目录的文件图标 1 2 右键属性选择兼容性 1 3 选择更改所有用户的设置然后勾选以管理员身份运行此程序后重新打开vscode 2 在vscode修改配置文件 2 1 打开vs
  • Vue项目启动报错 error:cannot find module xxx

    原因 xff1a 无法找到项目依赖的某个模块 解决办法 xff1a 1 删掉存放模块的文件夹node module xff1b 2 执行清除缓存命令 npm cache clean xff1b 如果报错 xff0c 使用强制清除npm ca
  • OkHttp-(一)HttpUrl了解

    1 xff0c git地址 xff1a https github com square okhttp 2 xff0c 官网地址 xff1a https square github io okhttp Http作为现代应用程序的常用联网方式
  • 学习网络编程第一步,安装NetAssist网络调试助手

    x1f4d6 摘要 今天分享下 遇到 Request header is too large xff0c 如何解决 xff0c 欢迎关注 xff01 x1f91e 简单介绍 NetAssist 是一款免安装的网络调试助手工具 今天给大家带来
  • 初学STM32之串口通信

    文章目录 一 背景知识1 处理器与外部通信的两种方式2 串行通信的三种传输方式3 串行通信的通信方式 二 串口通信基础1 STM32的串口通信接口2 UART异步通信引脚连接方法3 UART异步通信方式特点4 串口异步通信需要定义的参数 三
  • 前端架构图解

随机推荐

  • Ubuntu 18.04快捷安装ROS Melodic及rosdep update time out的问题解决

    1 ROS快捷安装 以下安装指令汇总针对Ubuntu18 04的ROS Melodic版本 xff1a 强烈建议复制以下指令到新建的xxx sh文件中 xff0c 保存后给xxx sh权限 xff0c 然后执行脚本一路输入y等候安装完成 e
  • NVIDIA Jetson AGX Xavier学习笔记3——环境配置(pytorch、torchvision、cv2)

    最近研究中需要使用NVIDIA Jetson AGX Xavier人工智能开发组件 由于也是第一次接触相关硬件设备 xff0c 遇到了很多困难 在这里记录整个Jetson AGX Xavier组件的学习过程 其中很多内容网上有比较详细的教程
  • Linux网络编程——tcp实例

    题目 1 通过TCP协议实现多个client端可以并发连接到server xff0c client可获得server指定目录下的文件列表 span class hljs comment client c Created on 2016年11
  • A星寻路算法的学习总结(详解)

    目录 1 理论基础 1 1A星寻路是用来解决什么问题的 1 2A星寻路的基本原理 2 代码实现 2 1每个格子的信息 2 2A星寻路管理器 2 3测试代码 3 实例演示 1 理论基础 1 1A星寻路是用来解决什么问题的 A星寻路是用来计算玩
  • C语言单片机栈、堆、堆栈的区别(仅供参考)

    计算机C语言中各个变量的存放区域 xff1a 代码区 xff08 CODE xff09 xff1a 存放函数代码 xff1b 静态数据区 xff08 DATA xff09 xff1a 存放全局变量 静态变量 xff1b 堆区 xff08 H
  • 用c语言写链表

    链表是数据结构的一种 xff0c 是其他三个数据结构栈 xff0c 树 xff0c 图的基础 xff0c 只有将链表这一数据结构弄懂 xff0c 才能理解其他三种数据结构 举一个例子 xff0c 老师让你设计一个联系人系统 xff0c 其中
  • Fiddler抓包工具详解

    Fiddler的详细介绍 一 Fiddler与其他抓包工具的区别 1 Firebug虽然可以抓包 xff0c 但是对于分析http请求的详细信息 xff0c 不够强大 模拟http请求的功能也不够 xff0c 且firebug常常是需要 无
  • python 解析Json对象之jsonpath_rw用法

    jsonpath rw xff1a 一个可以像写xpath一样写json的Python第三方库 首先安装 xff1a pip install jsonpath rw 实例 xff1a from jsonpath rw import json
  • selenium之xpath使用

    XPath即XML路径语言 xff0c 支持从xml或html中查找元素节点 xff0c 使用XPath完全可以替代其他定位放式 xff0c 如 xff1a find element by xpath 39 64 id 61 34 34 3
  • Python-面向对象之多态

    当子类和父类都存在相同的run 方法时 xff0c 我们说 xff0c 子类的run 覆盖了父类的run xff0c 在代码运行的时候 xff0c 总是会调用子类的run 这样 xff0c 我们就获得了继承的另一个好处 xff1a 多态 c
  • 使用Ubuntu帐户创建SFTP

    提供sftp服务的有vsftpd和internal sftp xff0c 这里用的是系统自带的internal sftp xff0c 操作步骤如下 xff1a 1 创建用户 testenv xff0c 并禁止ssh登录 xff0c 不创建家
  • flask数据分页paginate的使用(flask学习)

    Flask的数据分页示例 1 xff0c 首先写数据获取的视图函数 xff0c 就像这样 xff1a 64 app route 39 39 64 login required def index page 61 request args g
  • Python __dict__属性详解

    我们都知道Python一切皆对象 xff0c 那么Python究竟是怎么管理对象的呢 xff1f 1 无处不在的 dict 首先看一下类的 dict 属性和类对象的 dict 属性 coding utf 8 class A object 3
  • Flask-SQLAlchemy 中的 relationship & backref

    今天重看 Flask 时 xff0c 发现对backref仍然没有理解透彻 查阅文档后发现 xff0c 以前试图孤立地理解backref是问题之源 xff0c backref是与relationship配合使用的 一对多关系 db rela
  • Django HttpResponse与JsonResponse

    我们编写一些接口函数的时候 xff0c 经常需要给调用者返回json格式的数据 xff0c 那么如何返回可直接解析的json格式的数据呢 xff1f 首先先来第一种方式 xff1a from django shortcuts import
  • Ubuntu安装mysql

    首先执行下面三条命令 xff1a sudo apt get install mysql server sudo apt install mysql client sudo apt install libmysqlclient dev 安装成
  • 10种动态进度条用css3实现

    用css做的10种动态进度条 xff0c 喜欢可以直接去用话不多说先看效果图 xff1a 实现上图的 xff0c 最主要的就是应用了css动画属性 64 keyframes和animation属性结合应用 下面看看语法 xff1a 64 k
  • Yolo训练数据标注工具-Yolo_mark 使用教程

    一 安装与测试 环境 xff1a Ubuntu16 04 43 Opnecv 43 Cmake 项目地址 xff1a https github com AlexeyAB Yolo mark 下载 打开终端 xff0c 键入 xff1a gi
  • x86、ARM分属大小端

    小端模式 xff1a 一个数据的高位在大的地址端 xff0c 低位在小的地址端 xff0c x86也就是pc机就是小端的 xff1a include 34 stdio h 34 include 34 stdlib h 34 int main
  • 二叉树(C语言实现)——链式存储结构

    include lt stdio h gt include lt stdlib h gt include lt stdbool h gt define QueueSize 200 typedef char DataType typedef