关于树的一些学习心得
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、树的概念
- 二、使用步骤
- 1.引入库
- 2.读入数据
- 总结
前言
树是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0)个有限节点组成一个具有层次关系的集合。
一、树的各种概念
满足树的条件:
1、有且仅有一个根节点
2、其余的节点可以分为m个互不相交的有限集合
1. 度数
一个节点的子树的个数称为该节点的度数,一棵树的度数是指该树种节点的最大度数
2. 树叶
度数为0的节点
3. 深度(高度)
节点的层数等于父节点的层数加1,根节点的层数定义为1,把树种节点层数的最大值称为该树的深度或者高度
4. 边数
一个节点系列k1,k2, ……,ki,ki+1, ……,kj,并满足ki是ki+1的父节点,就称为一条从k1到kj的路径,路径的长度为j-1,即路径中的边数
5. 二叉树
5.1概念
二叉树是n个节点的有限集合,它或者是空集,或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成
注意:二叉树严格区分左孩子和右孩子,即使只有一个子节点也要区分左右
5.2 特征
1、二叉树最多有两个子节点
2、严格区分左子树和右子树
5.3 二叉树的性质
- 二叉树第i(i>=1)层上的节点最多为2i-1个
- 深度为k(k>=1)的二叉树最多有2k-1个节点
总节点的个数:n = 2^0+2^1+2^2 +……+2^(k-1)
2n = 2^1+2^2+……2^(k-1)+2^k
两个相减:n = 2k-1
3、在任意二叉树中,树叶的数目比度数为2的数目多1:
所有节点的个数为n = 所有的子节点的个数+1(根节点)
度数为0的节点的个数为n0,它的子节点的个数为0
度数为1的节点的个数为n1,它的子节点的个数为n1
度数为2的节点的个数为n2,它的子节点的个数为2n2
n = 0+n1+2n2+1
n0+n1+n2 = 0+n1+2n2+1
n0 = n2+1
案例:2、具有10个叶节点的二叉树有(B )个度数为2的节点
A.8 B.9 C.10 D.11
5.4二叉树的遍历
解题思路:一般来说,会给出一个前序遍历的结果或者一个后序遍历的结果,再给出一个中序遍历的结果,求另外一个遍历结果。
先看前/后序遍历,可以的出根是谁,再看中序看根左边有谁右边有谁,轮换着看,知道最后画出相应的图。
二、使用步骤
1.引入库
代码如下(示例):
//创建树的根结点
Tree *createTree(data_type item)
{Tree *pBoot = NULL;pBoot = (Tree *)malloc(sizeof(Tree));if(NULL == pBoot){perror("malloc error");return NULL;}memset(pBoot,0,sizeof(Tree));pBoot->data = item;return pBoot;
}
//向数中插入数据
int insertTree(Tree *pBoot,data_type item)
{//1.入参判断if(NULL == pBoot){return PBOOTNULL;}//2.创建一个新节点Tree *pNew = (Tree *)malloc(sizeof(Tree));if(NULL == pNew){perror("malloc error");return MALLOCERROR;}memset(pNew,0,sizeof(Tree));pNew->data = item;//3.插入while(1){//判断pNew是左孩子还是右孩子if(pNew->data < pBoot->data){//左孩子if(pBoot->lChild != NULL){pBoot = pBoot->lChild;}else{pBoot->lChild = pNew;return OK;}}else{//右孩子if(pBoot->rChild != NULL){pBoot = pBoot->rChild;}else{pBoot->rChild = pNew;return OK;}}}
}//中序遍历
void midOrder(Tree *pBoot)
{if(NULL == pBoot){return ;}midOrder(pBoot->lChild);printf("%d ",pBoot->data);midOrder(pBoot->rChild);
}
2.读入数据
代码如下(示例):
int main(void)
{int i;data_type arr[20] = {54,26,33,42,98,77,88,12,5,18};Tree *pBoot = createTree(arr[0]);for(i = 1; i < 10; i++){insertTree(pBoot,arr[i]);}midOrder(pBoot);printf("\n");return 0;
}
总结
学习树这一块,主要是把概念记清楚,并记住遍历的方式等。这一块的代码并不难写,还需要加深学习。
关于树的一些学习心得相关推荐
- 我的MYSQL学习心得(十六) 优化
原文:我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看 ...
- c语言节点有指针域数据域,学习心得:链表的操作(C语言实现)
今天将给大家讲述链表的学习心得.学习数据结构,毋庸置疑链表必须学好,后面的栈.队列.树.图都是以链表为基础的:链表的种类很多,有单链表.双链表.循环链表.非循环链表:在此,我们以非循环单链表为例,来讲 ...
- 数据科学学习心得_学习数据科学时如何保持动力
数据科学学习心得 When trying to learn anything all by yourself, it is easy to lose motivation and get thrown ...
- string 转 json_手写Json解析器学习心得
哦?从"{"开始,看来是个对象了! 一. 介绍 一周前,老同学阿立给我转了一篇知乎回答,答主说检验一门语言是否掌握的标准是实现一个Json解析器,网易游戏过去的Python入门培训 ...
- 计算机90学时培训小结,90学时培训学习心得体会
人道是课难上,复习课更难上.此话着实不假,我在日常教学过程中也深有体会.毋庸讳言,本人在日常教学过程中抑或自以为是--重复知识点加练习,习题加点评,抑或面对复习课一脸茫然,尤其是面对如何上出高效.新颖 ...
- ACM学习心得(5000字)
ACM学习心得 姓名: 邓华伟 学号: 20163940 专业班级:计算机1班 转眼之间,一个学期就这么过去了,ACM课程也圆满的落下了帷幕,经过这一学期的学习 ...
- 《数据结构与算法 Python语言实现》书评与学习心得
做为Python小白,本人几个月前读完了Mark Lutz的1400页巨著<Learning Python>(太TM啰嗦了,读过的请举手),本打算继续学习下一步<Programmin ...
- 神经网络程序设计学习心得
神经网络程序设计学习心得 简枢 SB16225001 本学期有幸再次选择了孟宁老师的2016年秋-网络程序设计课程.该课程主要聚焦于神经网络程序设计,基于深度学习神经网络等机器学习技术实现一个医学 ...
- android中级培训,Android 中级学习心得
不知不觉一个月又过去了,中级部分已经学习完毕,给大家讲讲学习心得,希望对新人有所帮助,中级部分主要是一些控件的设置,以及实现一些控件的功能. Android通知系统,Tostask 比较常用:进度条p ...
最新文章
- Unicode编码问题,编程方面的技巧集合
- Linux下配置SSL (转)
- 路由器无服务器无响应是怎么回事啊,wifi服务器无响应怎么解决(图文)
- 在DataGridView中添加行号
- VC中实现GCC的2个比较常用的位运算函数
- CentOS 安装MySQL rpm方式安装
- ASA防火墙外部web应用端口与默认审查协议相冲突的解决方法
- 用commons-fileupload-1.2 实现文件上传
- mysql 事务 for update_mysql事务,select for update,及数据的一致性处理
- 在家办公这半年,让我开始热爱生活
- Java中的形参和实参的区别以及传值调用和传引用调用
- 【Elasticsearch】java 客户端 获取 termvectors 词频 统计
- 学习记录012-NFS
- java lang runtimeexception什么意思_Java基础之异常
- python必背代码-让你的python代码优雅地道的小技巧
- 调试内存_如何调试Python 程序的内存泄露问题
- typeScrip(三) 类
- 工地小哥逆袭转行程序员的真实故事
- weico.android批量转发,weico android|Weico新浪微博3.3.5 客户端_手机软件
- FBReader阅读引擎支持的功能