二叉树遍历(代码,分析,汇编)

目录:

    • 代码:
    • 分析:
    • 汇编:

代码:

BTree.h
BTree.c
二叉树(多路平衡搜索树)

LinkQueue.h

#ifndef _LINKQUEUE_H_
#define _LINKQUEUE_H_typedef void LinkQueue;//定义队列类型LinkQueue* LinkQueue_Create();//声明创建队列函数void LinkQueue_Destroy(LinkQueue* queue);//声明销毁队列函数void LinkQueue_Clear(LinkQueue* queue);//声明清空队列函数int LinkQueue_Append(LinkQueue* queue, void* item);//声明添加进队函数void* LinkQueue_Retrieve(LinkQueue* queue);//声明出队函数void* LinkQueue_Header(LinkQueue* queue);//声明获取头元素函数int LinkQueue_Length(LinkQueue* queue);//声明获取长度函数#endif

LinkQueue.c

#include <malloc.h>
#include <stdio.h>
#include "LinkQueue.h"typedef struct _tag_LinkQueueNode TLinkQueueNode;//定义队列节点类型
struct _tag_LinkQueueNode
{TLinkQueueNode* next;//下节点指针void* item;//节点存储数据指针
};typedef struct _tag_LinkQueue//定义实际使用队列类型
{TLinkQueueNode* front;//前节点(头节点)一直指向第一个节点用于出队列TLinkQueueNode* rear;//后节点int length;//长度
} TLinkQueue;LinkQueue* LinkQueue_Create() // 定义创建队列函数
{TLinkQueue* ret = (TLinkQueue*)malloc(sizeof(TLinkQueue));if( ret != NULL )//创建成功{ret->front = NULL;//前节点指向空ret->rear = NULL;//后节点指向空ret->length = 0;//长度设空}return ret;//返回创建队列
}void LinkQueue_Destroy(LinkQueue* queue) //定义销毁队列函数
{LinkQueue_Clear(queue);//先清空队列free(queue);//释放队列空间
}void LinkQueue_Clear(LinkQueue* queue) // 定义清空队列函数
{while( LinkQueue_Length(queue) > 0 )//将所有节点出队列操作{LinkQueue_Retrieve(queue);}
}int LinkQueue_Append(LinkQueue* queue, void* item) //定义添加进队列函数
{TLinkQueue* sQueue = (TLinkQueue*)queue;//取得队列TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));//创建节点int ret = (sQueue != NULL ) && (item != NULL) && (node != NULL);//如果队列与数据不为空和创建节点成功if( ret ){node->item = item;//给新建节点赋值存储数据if( sQueue->length > 0 )//如果队列当前长度大于0{sQueue->rear->next = node;//树的后节点的下一个节点指向新建节点sQueue->rear = node;//将新建节点设为树的后节点,实现每次添加都往连接node->next = NULL;//新建节点的下一个节点设空}else//否则是第一个节点{sQueue->front = node;//树的前节点指向新建节点sQueue->rear = node;//树的后节点指向新建节点node->next = NULL;//新节点的下一个节点为空}sQueue->length++;//长度增加}if( !ret )//如果条件不成功{free(node);//释放新建节点空间}return ret;
}void* LinkQueue_Retrieve(LinkQueue* queue) //定义出队列函数
{TLinkQueue* sQueue = (TLinkQueue*)queue;//取得队列TLinkQueueNode* node = NULL;void* ret = NULL;if( (sQueue != NULL) && (sQueue->length > 0) )//如果队列不为空与长度大于0{node = sQueue->front;//取得出队列节点 sQueue->front = node->next;//将前节点指向出队列节点的下一个节点ret = node->item;//取得节点存储数据free(node);//释放该节点sQueue->length--;//长度减少if( sQueue->length == 0 )//如果是最后一个节点,将队列重置都为空{sQueue->front = NULL;sQueue->rear = NULL;}}return ret;//返回节点数据
}void* LinkQueue_Header(LinkQueue* queue) // 定义获取头节点函数
{TLinkQueue* sQueue = (TLinkQueue*)queue;//取得队列void* ret = NULL;if( (sQueue != NULL) && (sQueue->length > 0) )//如果队列不为空与长度大于0{ret = sQueue->front->item;//取得第一个节点存储数据}return ret;//返回数据
}int LinkQueue_Length(LinkQueue* queue) // 定义获取长度函数
{TLinkQueue* sQueue = (TLinkQueue*)queue;//取得树int ret = -1;if( sQueue != NULL ){ret = sQueue->length;//取得长度}return ret;//返回长度
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "BTree.h"
#include "LinkQueue.h"struct Node//定义节点
{BTreeNode header;char v;
};void printf_data(BTreeNode* node)//将节点内容输出函数
{if( node != NULL ){printf("%c", ((struct Node*)node)->v);}
}void pre_order_traversal(BTreeNode* root)//
{if( root != NULL ){printf("%c, ", ((struct Node*)root)->v);pre_order_traversal(root->left);pre_order_traversal(root->right);}
}void middle_order_traversal(BTreeNode* root)
{if( root != NULL ){middle_order_traversal(root->left);printf("%c, ", ((struct Node*)root)->v);middle_order_traversal(root->right);}
}void post_order_traversal(BTreeNode* root)
{if( root != NULL ){post_order_traversal(root->left);post_order_traversal(root->right);printf("%c, ", ((struct Node*)root)->v);}
}void level_order_traversal(BTreeNode* root)
{printf("==%c\n", ((struct Node*)root)->v);if( root != NULL ){LinkQueue* queue = LinkQueue_Create();//创建队列if( queue != NULL )//创建成功{LinkQueue_Append(queue, root);//将节点进队列while( LinkQueue_Length(queue) > 0 ){struct Node* node = (struct Node*)LinkQueue_Retrieve(queue);//出队列printf("%c, ", node->v);//输出节点存储的数据LinkQueue_Append(queue, node->header.left);//将左子节点进队列LinkQueue_Append(queue, node->header.right);//将右子节点进队列}}LinkQueue_Destroy(queue);}
}int main(int argc, char *argv[])
{BTree* tree = BTree_Create();struct Node n1 = {{NULL, NULL}, 'A'};struct Node n2 = {{NULL, NULL}, 'B'};struct Node n3 = {{NULL, NULL}, 'C'};struct Node n4 = {{NULL, NULL}, 'D'};struct Node n5 = {{NULL, NULL}, 'E'};struct Node n6 = {{NULL, NULL}, 'F'};BTree_Insert(tree, (BTreeNode*)&n1, 0, 0, 0);BTree_Insert(tree, (BTreeNode*)&n2, 0x00, 1, 0);BTree_Insert(tree, (BTreeNode*)&n3, 0x01, 1, 0);BTree_Insert(tree, (BTreeNode*)&n4, 0x00, 2, 0);BTree_Insert(tree, (BTreeNode*)&n5, 0x02, 2, 0);BTree_Insert(tree, (BTreeNode*)&n6, 0x02, 3, 0);printf("Full Tree: \n");BTree_Display(tree, printf_data, 4, '-');printf("Pre Order Traversal:\n");pre_order_traversal(BTree_Root(tree));//输出:ABDEFCprintf("\n");printf("Middle Order Traversal:\n");middle_order_traversal(BTree_Root(tree));//输出:DBFEACprintf("\n");printf("Post Order Traversal:\n");post_order_traversal(BTree_Root(tree));//输出:DFEBCAprintf("\n");printf("Level Order Traversal:\n");level_order_traversal(BTree_Root(tree));//输出:ABCDEFprintf("\n");BTree_Destroy(tree);getchar();return 0;
}

分析:

LinkQueue :
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main中的调用函数过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

汇编:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Python---查找序列的最长递增子序列

查找序列的最长递增子序列 什么是序列的最长递增子序列&#xff1f; 答&#xff1a;在一个数值序列中&#xff0c;找到一个子序列&#xff0c;使得这个子序列元素的数值依次递增&#xff0c;并且这个子序列的长度尽可能地大。这就是所谓的最长递增子序列 from itertools impo…

ffmpeg-从mp4、flv、ts文件中提取264视频流数据

ffmpeg-从mp4、flv、ts文件中提取264视频流数据 main.c #include <stdio.h> #include <libavutil/log.h> #include <libavformat/avio.h> #include <libavformat/avformat.h>void proc(int need_to_annexb, char* in_file, char* out_file) {AVForma…

线索化二叉树(代码 、分析 、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h BTree.c 二叉树&#xff08;多路平衡搜索树&#xff09; SeqList.h SeqList.c 顺序表 main.c #include <stdio.h> #include <stdlib.h> #include "BTree.h&qu…

Python---寻找给定序列中相差最小的两个数字

编写函数&#xff0c;寻找给定序列中相差最小的两个数字 def getTwoClosestElements(arr):#先进行排序&#xff0c;使得相邻元素最接近#相差最小的元素必然相邻seq sorted(arr)#先进行排序dif float(inf)#无穷大#遍历所有元素&#xff0c;两两比较&#xff0c;比较相邻元素的…

Python---利用蒙特.卡罗方法计算圆周率近似值

利用蒙特.卡罗方法计算圆周率近似值 什么是蒙特.卡罗方法&#xff1f; 答&#xff1a;蒙特卡罗方法是一种计算方法。原理是通过大量随机样本&#xff0c;去了解一个系统&#xff0c;进而得到所要计算的值。 正方形内部有一个相切的圆&#xff0c;它们的面积之比是π/4。 这里假…

FLV封装格式的分析

FLV封装格式的分析&#xff0c;各种详细的参数比较多没有详细解释&#xff0c;这是总体的格式分布。详细的参数说明可以参照文档。 以flv格式内封装的音频流是aac、视频流是h264分析&#xff1a; flv文件tag部分截图&#xff1a;可以看到音频TAG、视频TAG是交错存储的

《计算机基础复习》===数据库技术基础

数据库系统三级结构&#xff1a; 数据库系统一般划分为三个抽象级&#xff1a;用户级、概念级、物理级。 1&#xff09;用户级数据库&#xff1a;对应于外模式。它是用户看到和使用的数据库&#xff0c;又称用户视图&#xff1b;用户级数据库主要由外部记录组成&#xff0c;不同…

bs架构 erp 进销存_从依赖经验到用柔性ERP,企业少走了多少弯路?

企业在面对紧急订单时&#xff0c;传统企业将面临两难问题&#xff1a;如不接受紧急订单,可能会导致潜在的顾客丢失,损失市场占有率;接受紧急订单,可能会给企业带来很多管理上的问题,如材料采购、库存管理等。而企业通过信息化手段提升生产计划与控制的柔性&#xff0c;则可从容…

云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)

云端 是一个小软件&#xff0c;但又是一个大平台。安装云端之后&#xff0c;再使用其他软件不再需要安装——一点、下载、直接使用&#xff1b;并且&#xff0c;通过虚拟化的运行环境&#xff0c;能够保持系统长久的干净、绿色&#xff0c;并保持软件与系统的安全隔离——此方面…

MGraph图(代码、分析、汇编)

目录:代码&#xff1a;分析&#xff1a;汇编&#xff1a;MGrapth图表示有邻接矩阵的方式构成的图结构。邻接矩阵用两个数组保存数据&#xff0c;一个一维数组存储图中的顶点信息&#xff0c;一个二维数组存储图中边或弧的信息。无向图中的二维数组是个对称矩阵 1.0表示无边&…

java: 程序包lombok不存在_Java开发神器:Lombok 学习指南

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;semlinkerwww.segmentfault.com/a/1190000020864572一、Lombok 简介Lombok 是一款 Java 开发插件&#xff0c;使得 Java 开发者可以通过其定义的一些注解来消除业务工程中…

AAC ADTS格式分析

AAC ADTS格式分析&#xff1a; 没有详细的参数说明&#xff0c;只有格式分析。可以查询文档查看详细参数说明。 ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格 式。AAC音频格式在MPEG-2&#xff08;ISO-13318-7 2003&#xff09;中有定义。AAC后来 又被采用到…

新知道的几个东西

nginx&#xff08;发音同engine x&#xff09;是一款由俄罗斯程序设计师Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。起初是供俄国大型的入口网站及搜寻引擎Rambler&#xff08;俄文&#xff1a;Рамбл…

台达plc控制伺服电机编程实例_PLC控制伺服电机:控制脉冲的相关计算

伺服电机PLC通过脉冲的方式控制伺服电机时&#xff0c;其输出脉冲与伺服电机的配置应具有一定的对应关系。如&#xff0c;PLC输出多少个脉冲电机旋转一圈&#xff1f;电机旋转一圈移动的距离(或角度)是多少&#xff1f;这里我们以某伺服电机为例进行举例说明&#xff1a;完成对…

实验四 Windows程序设计

1&#xff0c;创建Windows窗体应用程序&#xff0c;实现用户登录功能&#xff0c;当输入正确与错误时均给出相应的提示信息&#xff0c;规定用户输入错误次数不能超过3次。&#xff08;源代码运行界面&#xff09; 这里的口令有个小常识&#xff0c;就是显示*&#xff0c;在口令…

最小连通-(代码、分析、汇编)

目录&#xff1a;介绍&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;介绍&#xff1a; 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n 个结点&#xff0c; 并且有保持图连通的最少的边。 最小生成树可以用kruskal&am…

c++ 怎样连接两个链表_LeetCode | 链表的入口,一文帮你搞定“环形链表”(python版,最简单解析)...

链表节点的定义链表作为一种数据结构&#xff0c;由链表节点互相连接构成。链表节点包含自身的数据和一个指向下一节点的指针。""" Definition of ListNode """ class ListNode(object):def __init__(self, val, nextNone):self.val valself.ne…

QI实例-改变空间参考

学习AE一段时间了&#xff0c;总是对QI不是很理解&#xff0c;今天一晚上写了QI实例&#xff0c;尝试理解下。 首先想到的是→改变空间参考→alter、SpatialReference→alterSpatialReference&#xff0c;输入到帮助文档里。  查看是IGeoDatasetSchemaEdit接口的方法&#xf…

C#省市二级联动(王者荣耀挑选英雄为例)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace beyond_联动_ {public partial clas…

二叉排序树(Binary Sort Tree) 又称为二叉查找树(Binary Search Tree) - (代码、分析)

目录&#xff1a;代码&#xff1a;分析&#xff1a;代码&#xff1a; BSTree.h #ifndef _BSTREE_H_ #define _BSTREE_H_typedef void BSTree;//定义二叉树类型 typedef void BSKey;//定义节点的键值类型&#xff08;用于节点排序&#xff09;typedef struct _tag_BSTreeNode …