在二叉树之前的数据结构学习中,我们学习了顺序表、链表、栈、队列这几种结构,它们都是用链表或者数组的方式来实现的,主要考察我们对结构体的运用! 今天让我们来学习一个新的数据结构,也就是下面这副图里面的树 啊不好意思,图拿错了!???? 是下面这个才对 1。什么是树?1。1树的概念 树是一种非线性的数据结构,它是由n个有限节点组成的具有一定层次关系的集合。 把它叫做树是因为它看起来的确像一个树的根部 当然也可以理解为是树干在上,树叶在下的结构 有一个特殊的节点,被称为根节点,也就是树的开头 除了根节点外,其余节点都是,个互不相交的集合。每一个集合都是一颗与树的结构类似的子树 每一个节点只能有一个前驱,但是可以有很多个后驱 因此,树是递归定义的 树中的子节点不能有交集 上图中的B节点不能有G这个孩子,因为G已经有父母C了 同理,G节点也不能同时拥有两对父母 子节点之间也不能相连,如E和F不能相连1。2树的相关知识点 节点的度:一个节点含有的子树的个数称为该节点的度;如下图:A的度为6 叶节点或终端节点:度为0的节点称为叶节点;图中B、C、H、I等节点为叶节点 非终端节点或分支节点:度不为0的节点;如上图中D、E、F、G等节点为分支节点 简单的说,就是有娃的节点就是分支节点 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图,D是H的父节点 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;如上图:H是D的孩子节点 兄弟节点:具有相同父节点的节点互称为兄弟节点;如下图:P、Q是兄弟节点 树的度:一棵树中,最大的节点的度称为树的度;示例中树的度为6(即A的度) 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推 树的高度或深度:树中节点的最大层次;示例中树的高度为4 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如下图:H、I互为兄弟节点 节点的祖先:从根到该节点所经分支上的所有节点;示例中A是所有节点的祖先 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。示例中所有节点都是A的子孙 森林:由m(m0)棵互不相交的树的集合称为森林 多个不相交的树就是森林 1。3树的代码表示 表示树的方式有很多种,比如下面这种defineN5指定树的度为5structTreeNode{structTreeNodesubs〔N〕;用指针数组存放孩子节点的指针}; 但这种方法不够优,给大家展示一个用的最广泛的方法孩子兄弟表示法typedefintDataTstructNode{structNodefirstChild1;第一个孩子结点structNodepNextB指向其下一个兄弟结点DataT结点中的数据域}; 通过这种方法,父亲节点只需要保存它的第一个娃,其他娃就让大娃的兄弟节点来找 也就是家长只用管老大,老大管老二,老二管老三,依次往下 实际写代码的结构大概是下图这样 2。二叉树 在实际中,二叉树是使用较多的一种树的结构2。1概念 二叉树是度为2的树,它是一个特殊的树 二叉树不存在度大于2的节点 二叉树是有序树,它的娃(子树)有左右之分,次序不能颠倒 所以,二叉树都是由下面各类节点组成的树 2。2特殊的二叉树 满二叉树:如果每一个层的节点数都达到最大值,那这个二叉树就是满二叉树。也就是说:满二叉树的层数为k,且节点总数是2k1 满二叉树的节点数是一个等比数列公式 202122。。。2k11(12k)(12)2k1202122。。。2{k1}1(12k)(12)2k1202122。。。2k11(12k)(12)2k1 完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与深度为K的满二叉树中编号从1至n的节点一一对应时,称为完全二叉树。 简单说来,完全二叉树的最后一层不一定满,但必须要从左到右连续 满二叉树是一个特殊的完全二叉树2。3二叉树的性质 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2(i1)个结点 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2h1 对任何一棵二叉树,如果度为0其叶结点个数为n0,度为2的分支结点个数为n2,则有n0n21 若规定根节点的层数为1,具有n个结点的满二叉树的深度,hlog2(n1)。(ps:是log以2为底,n1为对数) 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有: 若i0,i位置节点的双亲序号:(i1)2;i0,i为根节点编号,无双亲节点 若2i1n否则无左孩子 若2i2n否则无右孩子 2。4几个选择题 1。某二叉树共有399个结点,其中有199个度为2的结点,则该二叉树中的叶子结点数为() A不存在这样的二叉树 B200 C198 D199 叶子节点的数量总比度为2的节点多1 2。在具有2n个结点的完全二叉树中,叶子结点个数为() An Bn1 Cn1 Dn2 N0N1N22n 2N0N112n N1只有0和1两种可能,因为n为整数,2n为偶数,所以2N02n,N0n 3。一棵完全二叉树的节点数位为531个,那么这棵树的高度为() A11 B10 C8 D12 假设高度是h 完全二叉树节点最多2h1 最少2(h1)11 可以通过这两个公式,推断出h10 3。二叉树的存储结构 二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构3。1顺序存储 顺序结构存储就是使用数组来存储 一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。 现实使用中只有堆才会使用数组来存储 下一篇博客会带大家认识堆这个特殊的树形结构(和内存里面那个堆????没啥关系哈) 看到这张图,你肯定想问,如果用数组结构存储,那还怎么还原出一颗树????呢? 这里我们需要理解物理存储和逻辑结构的关系 二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树 那怎么计算这种情况下的父亲和娃呢? leftchildparent21 rightchildparent22 parent(child1)2 怎么样,是不是忽然感觉妙级了? 3。2链式存储 这就就没啥好说的啦,使用一个简单的二叉链就能构成二叉树typedefintBTDataT二叉链structBinaryTreeNode{structBinTreeNodepL指向当前节点左孩子structBinTreeNodepR指向当前节点右孩子BTDataT当前节点的值}结语 嘿嘿嘿,本篇博客到这里就结束啦! 著作权归作者所有:来自51CTO博客作者慕雪年华的原创作品,原文链接:https:blog。51cto。comu153070095202047,侵删 写在最后:另外,对于准备学习CC编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始! 编程学习书籍分享: 编程学习视频分享: 整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程) 欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦! 对于CC感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些CC的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!