数据结构有关树的知识总结(一)

前段时间准备考研,对数据结构做了一个简略的知识点总结,知识针对考研所用到的数据结构,下面是树的章节由于篇幅太多,将有关树的知识点分开发表,对B树和B+树没有深入了解,所以就没有总结出来。

这篇文章就先写到线索二叉树吧。

【知识点】树

(一)树有关结点、度、高度的计算题

(二)二叉树的遍历

(三)线索二叉树

(四)哈夫曼树

(五) 堆排序

(六)最佳归并树、败者树

(七)折半查找

      (八)二叉排序树和平衡二叉树

二叉树性质:

高度为h≥0的二叉树至少有h+1个结点;

高度为h≥0的二叉树至多有2h+1-1个结点;

约定空二叉树的高度为-1;

含有n≥1个结点的二叉树的高度至多为n-1;

完全二叉树性质:n个结点的完全二叉树的结点按层序编号,则对任一结点i(1≤i≤n):

如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是i/2(向下取整);

如果2i>n,则结点i无左孩子;如果2i≤n,则其左孩子是2i;

如果2i+1>n,则结点i无右孩子;如果2i+1≤n,则其右孩子是2i+1;

 

 

(一)树有关结点、度、高度的计算题

  1. 一棵度为3的树,有2个3度结点,1个2度结点,2个1度结点,则叶子结点有  6  个;

解:设叶子节点数为:N0,度为1的结点数:N1,度为2的结点数:N2,度为3的结点数:N3;

总结点个数=N0+N1+N2+N3

总分支数=N1+2*N2+3*N3

总结点数-1=总分支数(因为除了根节点之外,每一个节点都有唯一一个只想该节点的分支)

 

  1. 设树T的度为4,其中度为1、2、3、4的节点个数分别为4、2、1、1,则书中的叶子结点数为 8 个。

解:(总结点数-1)n0+n1+n2+n3+n4-1=n1+2*n2+3*n3+4*n4(总分支数)->n0=n2+2*n3+3*n4+1=2+2*1+3*1+1=8

 

  1. (2017算法计算13)二叉树度为0的结点数为M个,度为2的结点数为N2个,证明N2=M-1

证明:总结点数=M+N1+N2(叶子节点+度为1的结点(N1)+度为2的结点)

 总分支数=N1+2*N2

 总分支数=总结点数-1(因为除了根结点,每一个结点都有唯一只想该结点的分支)

 M+N1+N2-1=N1+2N——>M-1=N

 

  1. 按照二叉树的定义,有3个节点的二叉树有 5 种。(2016简答)

公式:即计算Catalan数,给定n个结点能构成h(n)=C(2n,n)/(n+1)种形态。(其中C(2n,n)是指以2n为底)。n=3,h(n)=C(6,2)/(3+1)=[(6*5*4)/(3*2*1)]/4=5

 

  1. 一棵二叉树有10个度为2的结点,5个度为1的结点,则度为0的结点数为 11 个。(M-1=N)

 

  1. 有10个叶结点的二叉树中有 9 个度为2的结点。(M-1=N:10-1=N(2度结点但数))

 

  1. 一棵完全二叉树上有1001个结点,其叶结点的个数有 501 个。

解:此题分两种情况:

(1)有单分支结点,分支总数=n1+2*n2,分支总数=结点总数-1=1000=n1+2*n2,因为是完全二叉树,故如果有单分支结点,也只能有一个,所以就有:1+2*n2=1000,解得n2非整数,所以没有单分支结点。

(2)无单分支结点,分支总数=2*2n=1001(总结点数)-1=1000,解得n2=500,叶子节点数=2度结点数+1=501

 

  1. 一棵高度为4的完全二叉树至少有 8 个节点。

解:高度为n的树最多有2ⁿ -1个节点,完全二叉树高度为4,则前三层是满二叉树,2³-1个结点。则该完全二叉树至少有(2³-1)+1个结点。

 

  1. 一棵高度为h的完全二叉树至少有 2^(h-1) 个结点。2^(h-1)-1]+1

 

10、一棵高度为5的完全二叉树最多有 31 个结点。(2的5次幂-1=31)。

 

11、假设高度为h的二叉树上只有0度和2度结点,此类二叉树的结点至少为 2h-1 个。

解答:如下图,除了第一层只有一个根节点,其余h-1层都有两个节点,则这样的二叉树最少有2(h-1)+1=2h-1个

12、在一棵三叉树中,3度的结点个数为2,2度的结点个数为1,1度的结点个数为2,则0度的结点个数为 8 。(n0+n1+n2+n3-1=n1+2*n2+3*n3-->n0=8)

 

13、哈夫曼二叉树中只有度为0和度为2的结点,有n个叶子结点的哈夫曼树的节点总数为 2n-1个。(叶子结点数=n2+1=n,n2=n-1,节点总数=n0+n2=n+n-1=2n-1)

 

14、一棵具有1025个结点的二叉树高度h的范围是 11~1025

解:当一棵二叉树每层只有一个结点时,高度最高为1025,而当这颗二叉树为完全二叉树时最矮,

h=㏒(1025+1)=11 (而且是向上取整)2的10次方是1024。

 

  1. 对一棵满二叉树,共有n个结点和m个叶子结点,高度为h,则他们之间的关系是 m=2^(h-1),n=2^h-1 。

 

  1. 已知一棵完全二叉树的第七层共有10个叶结点,则该二叉树结点最多为 235 个,最少为 73个。

解:

①最多的情况:第七层已满,树共有八层

第七层的结点个数为:2^(7-1)=64个结点,

10个叶结点在第八层上:64-10=54(第七层不是叶结点的节点个数),

第八层的节点个数为:54*2=108个,

前七层的节点总数为:2^7-1=127,

则整棵二叉树的结点为:128+108=235个(前七层的结点总数+第八层的结点数)。

②最少的情况:树共有七层,六层已满

前六层的结点总数:2^6-1=63个

第七层叶结点总数:10个

总数:63+10=73个

(二)二叉树的遍历

1、中缀表达式转化为后缀表达式

如一个表达式:(a-(b+c))*(d/e)

                                  

     二叉树表达式                                                     分成了两个部分

则后序遍历得:abe+-de/*

 

  1. 二叉树遍历重要技巧(2014)

前序遍历:A,B,C,D,E,F,G,H 中序遍历:C,B,E,D,F,A,H,G 后序遍历:C,E,F,D,B,H,G,A

三种遍历方法对相应上图中p经过每个节点的不同次数时对其进行输出的结果,如上图p沿着路线依次经过3号的结点次序就是后序遍历后的节点序列。

注:①已知前序遍历序列+中序遍历序列,可以确定一棵树,先由前序遍历找到根节点,再由中序确定左右子树。

②已知中序遍历序列+后序遍历序列,可以确定一棵树,先由后序遍历确定根节点,再由中序确定左右子树。

③已知前序遍历+后序遍历,不可以确定一棵树,都只能先确定根,但左右子树可以有两种表示方式。

  1. 树的遍历

·先序遍历:

·中序遍历

·后序遍历

·层次遍历

    层次遍历需要建立一个循环队列,先将二叉树的头节点入队,然后出队,访问该节点,如果队列不空,则循环访问其左右子树,如果有左子树,则将左子树根节点入队,如果有右子树,将右子树根节点入队,然后出队。

(三)线索二叉树

线索二叉树的结构:

lchild

ltag

data

rtag

rchild

  1. 若ltag=0,表示lchild为指针,指向结点的左孩子(有左子树),若ltag=1,表示该节点无左孩子,此时lchild为线索,指向结点的前驱结点。
  2. 若rtag=0,表示rchlid为指针,指向结点的右孩子(有右孩子),若rtag=1,表示该节点无右孩子,此时rchlid为线索,指向结点的后继结点。

 

1、后继线索二叉树中寻找结点node的前驱和后继。

前驱:根据后序的特点,查找前驱是一个自顶向下的过程,即当右子树标记为0时,说明   node有右子树,此时node的前驱就是右儿子,否则就是它的左孩子。

prior(node,x){

    if(node != null){

        if(!node->rthread)//有右子树,则node的前驱时右子树

            *x = node->right;

        else

        *x = node->left;//没有右子树,则node的前驱时左子树

    }

}

后继:查找后继是一个自底向上的过程,与查找前驱不同的是,访问到node结点时,后继    还没办法访问,所以将查找node的后继*x的问题转换为查找*x的前驱的问题,即从    根节点开始,不断查找x的前驱,直到x的前驱为node时,x则为node的后继了。

next(bt,node,x){

    *x=bt;

    if(bt != 0 && node != null){

        if(node->rthread)//node没有右子树,则node->right指向的是node的后继

            *x = node->right;//此时x可以直接等于node的后继

        else{

            do{

                t=*x;

                prior(t,x);//不断找x的前驱

           }while(*x != node)//直到x的前驱是node,此时x就是弄得的后继

        *x = t;

          }

    }

}

  • 13
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
高分笔记系列书籍简介高分笔记系列书籍包括《数据结构高分笔记》《组成原理高分笔记》《操作系统高分笔记》《计算机网络高分笔记》等,是一套针对计算机考研的辅导书。它们2010 年夏天诞生于一群考生之手,其写作风格突出表现为:以学生的视角剖析知识难点;以通俗易懂的语言取代晦涩难懂的专业术语;以成功考生的亲身经历指引复习方向;以风趣幽默的笔触缓解考研压力。相信高分笔记系列书籍带给考生的将是更高效、更明确、更轻松、更愉快的复习过程。 数据结构高分笔记简介众所周知,在计算机统考的四门专业课中,最难拿高分的就是数据结构。但是这门课本身的难并不是考生最大的障碍,真正的障碍在于考生不能独自把握复习方向和考试范围。也许有学生要问,我们不是有大纲吗?照着大纲去复习不就可以了吗?表面上看是这样的,但是当你真正开始复习的时候就会发现,其实大纲只给了考生一个大致范围,有很多地方是模糊的,这些模糊的地方可能就是你纠结的地方。比如大纲里对于栈和队列的考查中有这么一条:“栈和队列的应用”。这个知识点就说得很模糊,因为只要涉及栈和队列的地方,都是其应用的范畴,这时考生该怎么办呢?于是把所有的希望寄托于参考书,希望参考书能帮助我们理解大纲的意图。参考书分为两种:一是课本,二是与课本配套的辅导书。对于课本,考生用得最多的就是严蔚敏老师编写的“严版”《数据结构》。因为这本书的内容非常丰富,如果能把这本书中考试大纲要求的章节理解透彻,参加考研就没有任何问题,但是这个过程是漫长的,除非本科阶段就学得非常好。计算机统考后,专业课四门加上公共课三门,一共是七门,绝大多数考生复习的时间一般也就六个月,而数据结构的复习需要占用多少时间,这点大家都很清楚。要在这么短的时间内掌握“严版”《数据结构》中考纲要求的知识点,基本上是不可能的,这就需要一本辅导书来依照大纲从课本中总结出考纲要求的知识点,才能使得考生在短时间内达到研究生考试的要求。市面上的参考书有两种:一种是四合一的辅导书,另一种是分册的。比如网上流行的《1800 题》及其第2 版,此书中题目极多,并且有很多老式的考研题,有些算法设计题的答案是用Pascal语言写的。这本书中的题目一般考生全做基本上是不可能的,挑着做又会把时间浪费在选题上。不可否认,这本书确实是一本非常好的题库,但是考生直接拿来用作考研辅导书却不太合适。在这种情况下,就需要有一本优质的完全针对新大纲的辅导书出现,这就是高分笔记产生的原因。 接下来详细介绍一下这本辅导书的写作过程,请看下图: 前 言VII图中所涉及的书都是大家很熟悉的。当年这些书编者都买了,花了很大心思才从中找出在考研战场上真正有用的东西。比如《1800 题》,里边既有好题,又有废题,相信很多人都希望有人能从中去掉重复的题目,选出大纲要求的题目,并能把解答写得更通俗易懂些,而现在编者所做的工作就是从这1800 道题中选出大纲要求的题目,并且修正部分解答,使其更容易理解。其次是“严版”《数据结构》,此书写得很严谨,语言表述非常专业,但对于基础稍差的学生来说读起来十分费力,要很长时间才能适应这本书的写作风格。如果有一本辅导书能把那些复杂程序的执行过程、拗口的专业术语、令人头大的符号翻译成容易理解的语言,就可以节省考生很多时间,因此,编者所做的事情就是根据自己复习的经验,以及对这本书的理解,把其中考试不需要的内容删掉,把需要的内容改造成一般考生容易接受的形式。对于李春葆老师的《数据结构习题与解析》,也做了类似的处理,并且在这本书中穿插讲解了一些考试大纲中没有明文规定,但是很多算法题目中大量用到的算法设计思想,来帮助大家提高解算法设计题的能力,比如搜索(打印图中两结点之间的所有路径)、分治法(二分法排序、求的深等)等算法思想。因此,相信本书会给读者的考研复习带来很大的帮助。 另外,本书配有微信公众号来收集读者的反馈,这也是本书不断更新完善的重要途径,即根据考生最需要的内容来作为调整讲解的依据。 本书特点: (1)精心挑选出适合考研的习题,并配上通俗易懂的答案,供读者自测和练习。 (2)总结出考研必备知识点,并且帮读者把其中过于专业、过于严谨的表述翻译成通俗易懂的语言。 (3)针对近年数据结构大题的出题风格(比如算法设计题目中的三段式题目:①表述算法思想;②写出算法描述;③计算算法的时间和空间复杂),设计了独特的真题仿造部分,让读者在复习的过程中逐渐适应不同类型的题目。 参加本书编写的人员还有:章露捷,刘建萍,施伟,刘炳瑞,刘菁,孙琪,金苍宏,2019 版数据结构高分笔记VIII蔡明婉,吴雪霞,孙建兴,张继建,胡素素,邱纪虎,率方杰,李玉兰,率秀颂,刘忠艳,赵建,张兆红,张来恩,张险峰,殷凤岭,于雪友,周桂芝,张玉奎,李亚静,周莉,李娅,刘梅,殷晓红,李艳红,王中静,张洪英,王艳红
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、形结构(如二叉、堆、B)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂和空间复杂。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂(运行时间随数据规模增长的速)和空间复杂(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
数据结构与算法的知识点包括以下内容: 1. 数据结构数据结构是指数据元素之间的关系和组织方式。常见的数据结构包括线性结构(如数组、链表、栈、队列)、形结构(如二叉、堆、哈夫曼)和图形结构(如邻接矩阵、邻接表)\[1\]。 2. 算法:算法是解决问题的一系列步骤或规则。常见的算法包括排序算法(如冒泡排序、快速排序、归并排序)、搜索算法(如线性搜索、二分搜索)、图算法(如深优先搜索、广优先搜索)和动态规划算法\[2\]。 3. 动态规划:动态规划是一种通过将问题拆分成一系列重复的子问题来求解问题的方法。它通常以自底向上的方式解决子问题,并将子问题的结果存储起来以避免重复计算\[2\]。 4. 贪心算法:贪心算法是一种通过每次选择局部最优解来得到整体最优解的方法。它通常以自顶向下的方式进行,每次作出贪心选择后将问题简化为规模更小的子问题\[3\]。 5. 位操作:位操作是在二进制数字符号的层面上进行的操作。它可以用来进行快速的比较和计算,比如按位与、按位或、按位异或等操作\[3\]。 这些知识点是数据结构与算法中的基础,掌握它们可以帮助我们更好地理解和解决各种问题。 #### 引用[.reference_title] - *1* [数据结构与算法——知识总结](https://blog.csdn.net/qq_41750911/article/details/125041841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [数据结构与算法知识总结](https://blog.csdn.net/weixin_40922285/article/details/103183295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值