当前位置: 首页 > news >正文

数据结构 - 树与二叉树

一.普通有序树的定义

1.树的概念及特性

二.二叉树的定义

1.二叉树的性质

2.二叉树的分类

        ①.满二叉树

             每一层的结点数都为最大值

        ②.完全二叉树

                完全二叉树是由满二叉树从下向上从右向左依次擦除若干个结点

3.二叉树的结构

三.链式二叉树的创建

1.链式二叉树的结构体定义

typedef int data_t;typedef struct btreenode
{data_t data;                            //数据域struct btreenode *lchild,*rchild;       //左结点与右结点的指针
}btree_node_t;

2.二叉树的创建

/*** @description:            使用键盘输入,创建一个二叉树* @param           :       无* @return          :       创建的二叉树的根结点指针
*/
btree_node_t *Btree_Create(void)
{data_t ch;                  //存储键盘输入的数据btree_node_t *new;          //指向新创建的结点/* 1.键盘输入要创建的结点的 data域 的值 */scanf("%c",&ch);if('#' == ch)return NULL;else{/* 2.创建根结点 */new = (btree_node_t *)malloc(sizeof(btree_node_t));if(NULL == new){perror("malloc error");return NULL;}/* 3.为根结点填充数据 */new->data = ch;/* 4.用相同的方法创建左子树 */new->lchild = Btree_Create();/* 5.用相同的办法创建右子树 */new->rchild = Btree_Create();}/* 6.返回根结点指针 */return new;}

四.二叉树的遍历

1.先序序列、中序序列、后序序列

①.先序序列:

        第一次经过结点的时候,去访问这个结点

②.中序序列:

        第二次经过结点的时候,去访问这个结点

③.后续序列:

        第三次经过结点的时候,去访问这个结点

④.层次遍历

2.遍历算法

①.先序递归遍历算法

/*** @description:            二叉树的先序遍历递归算法* @param - t       :       要遍历二叉树的指针* @return          :       无
*/
void Pre_order(btree_node_t *t)
{/* 树不为空 */if(NULL != t){/* 1.访问根结点 */printf("%c  ",t->data);/* 2.先序遍历左子树 */Pre_order(t->lchild);/* 3.先序遍历右子树 */Pre_order(t->rchild);}
}

②.中序递归遍历算法

/*** @description:            二叉树的中序遍历递归算法* @param - t       :       要遍历的二叉树的指针* @return          :       无
*/
void Mid_order(btree_node_t *t)
{/* 树不为空 */if(NULL != t){/* 1.中序遍历左子树 */Mid_order(t->lchild);/* 2.访问根结点 */printf("%c  ",t->data);/* 3.中序遍历右子树 */Mid_order(t->rchild);}
}

③.后序递归遍历算法啊

/*** @description:            二叉树的后序遍历递归算法* @param - t       :       要遍历的二叉树的指针* @return          :       无       
*/
void Post_order(btree_node_t *t)
{/* 树不为空 */if(NULL != t){/* 1.后序遍历左子树 */Post_order(t->lchild);/* 2.后序遍历右子树 */Post_order(t->rchild);/* 3.访问根结点 */printf("%c  ",t->data);}
}

④.层次遍历算法

/*** @description:            二叉树的层次遍历算法* @param - t       :       要遍历的二叉树的指针* @return          :       无
*/
void Level_order(btree_node_t *t)
{linkqueue_t *q;         //链式队列/* 一.初始化一个链式队列 */q = Linkqueue_Create();/* 二.开始层次遍历 */while(t != NULL){/* 1.访问 t 指向的结点数据 */printf("%c  ",t->data);/* 2.若 t 的左指针不为空 , 则入队 */if(t->lchild != NULL){Linkqueue_In(q,t->lchild);}/* 3.当 t 的右指针不为空 , 则入队 */if(t->rchild != NULL){Linkqueue_In(q,t->rchild);}/* 4.队列不为空 , 则出队 */if(!Linkqueue_is_empty(q))Linkqueue_Out(q,&t);elsebreak;}
}

⑤.先序非递归遍历算法

/*** @description:            二叉树的先序遍历非递归方法* @param - t       :       要操作的二叉树的指针* @return          :       无
*/
void Unpre_order(btree_node_t *t)
{/*  一.创建一个空栈 */linkstack_t *s;s = Linkstack_Create();if(NULL == s){printf("create stack error!\n");return ;}/* 二.先序遍历非递归算法,循环遍历 *//* 根结点是否为空,不为空则访问该结点。 为空且栈不为空,则出栈以访问右结点 */while(t != NULL || !Linkstack_Empty(s)){/* 1.若根结点不为空,则访问根结点 */if(t != NULL){printf("%c  ",t->data);/* 2.若该根结点的右结点不为空 , 则右结点的指针进栈 */if(NULL != t->rchild){Linkstack_Push(s,t->rchild);}/* 3.下一次遍历该结点的左子结点 */t = t->lchild;}/* 4.若该结点为空且栈内有右结点时 , 出栈以访问右结点 */else{t = Linkstack_Pop(s);}}
} 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 连不上服务器,超时
  • 2024 天池云原生编程挑战赛决赛名单出炉,冠军来自中山大学、昆仑数智战队
  • 数据中台建设方案汇报(可编辑的54页PPT)
  • ubuntu挂载磁盘或U盘
  • [杂谈-黑神话:悟空] 中国3A游戏的崛起之路:挑战与机遇并存
  • MFC -文件类控件
  • 【delphi】正则判断windows完整合法文件名,包括路径
  • 【深度学习】深度学习模型的加密及解密方案及源码
  • Python爬虫使用实例-umei
  • php环境搭建教程
  • Linux快速安装ClickHouse
  • P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
  • Iframe窗口通信
  • CentOS上使用Mosquitto实现Mqtt主题消息发布和订阅mqtt主题消息连同时间戳记录到文件
  • 爬虫的流程
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译] 怎样写一个基础的编译器
  • 【css3】浏览器内核及其兼容性
  • download使用浅析
  • ECMAScript入门(七)--Module语法
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Lucene解析 - 基本概念
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • use Google search engine
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 删除表内多余的重复数据
  • 首页查询功能的一次实现过程
  • 小程序测试方案初探
  • 以太坊客户端Geth命令参数详解
  • 《天龙八部3D》Unity技术方案揭秘
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • #define,static,const,三种常量的区别
  • $NOIp2018$劝退记
  • (8)STL算法之替换
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (ibm)Java 语言的 XPath API
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (三)终结任务
  • (十七)Flink 容错机制
  • (四) Graphivz 颜色选择
  • (五)IO流之ByteArrayInput/OutputStream
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .Net 4.0并行库实用性演练
  • .net core + vue 搭建前后端分离的框架
  • .net core 6 redis操作类