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

2023-05-16

前段时间准备考研,对数据结构做了一个简略的知识点总结,知识针对考研所用到的数据结构,下面是树的章节由于篇幅太多,将有关树的知识点分开发表,对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;

          }

    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • USB SS-PHY Tuning

    1 USB 3 0 PIPE PHY 1 1 USB 3 0 PHY USB 3 0 PHY 61 PIPE wrapper 43 PCS 43 SerDes 1 2 SS PHY电流源 CML电流源串联在NMOS管的Source中 xff
  • TF系列在PX4上的应用

    北醒TF 系列在PX4 上的应用 PX4 有着自己独特的优势 xff0c 受到广大爱好者的喜爱 TF 系列是北醒推出的性价比极高的激光雷达 xff0c 受到广大爱好者的追捧 本文介绍TF 系列和PX4 的连接方法 本文档基于QGroundC
  • 【Ardupilot (APM)】 Benewake(北醒) TFmini-i CAN 基于PixHawk的运用说明

    目录 一 前言二 TFmini i CAN 配置三 接线四 飞控参数设定4 1 避障的常用设置4 2 避障测试4 3 定高的常用设置4 4 定高测试 五 常见问题 一 前言 TFmini i CAN PixHawk1 CAN 端口或任何已刷
  • 用sourcetree对gitlab进行项目管理

    前言 目前公司项目存放在gitlab ce上 xff0c 由于开发人员用的系统有Windows和Mac xff0c 所以选择了比较容易上手的sourcetree进行管理 该管理基于了git flow和fork flow的结合 sourcet
  • vue-cli3混淆、压缩打包(另附问题解决方法)

    前言 欸 xff0c 其实这回也没什么前言了 xff0c 就是之前的代码需要做混淆之后压缩打包 使用这个插件 插件地址 https github com webpack contrib terser webpack plugin 安装命令
  • Centos7 安装 Paraview5.6.2

    1 下载Paraview 官网下载地址 xff1a Download ParaView 下载Paraview栏下的 tar gz压缩包 2 解压下载得到的压缩包 xff0c 获得目录 xff1a home hly 下载 ParaView 5
  • 程序员实用小工具(一)

    前言 整理一下工作当中比较常用的软件 xff0c 是一种分享 xff0c 也是一种记录 1 CSDN浏览器助手 这是CSDN官方推出的一款浏览器插件 首先界面就比较赏心悦目 xff0c 其次功能也比较多 xff0c 很多功能都集中在了一起
  • 「jira」筛选器的管理

    前言 目前 xff0c 公司使用的项目管理工具即为jira平台 xff0c 经过一段时间的探索与实践 xff0c 已经将一套运行流程制定完毕 xff0c 并在试运行期间 特此记录一下一些使用的方式与心得与大家分享 介绍 其实筛选器的就是为用
  • 「VScode」通过VScode进行git的版本管理

    前言 之前在git的版本管理上 xff0c 我使用的是sourcetree xff0c 说实话 xff0c 软件还是蛮好用的 xff0c 界面化做的很好看新手用起来也不复杂 xff0c 不过安装上不是很方便而已 但既然VScode提供了gi
  • 「npm」安装依赖时,报错Error: EACCES: permission denied

    背景 运行环境 xff1a CentOS Linux release 7 5 1804 node版本 xff1a v16 19 0 运行时执行 xff1a npm install 报错如下 xff1a vue span class toke
  • 「VScode」在vscode中通过cookie登录leetcode

    前言 我是用中国版的leetcode xff0c 但是不知道为什么用密码登录总是失败 xff0c 最后用cookie登录上的 简单记录一下 xff0c 方便大家查看 基础设置 扩展设置 在设置中找到 endpoint 选择 leetcode
  • Qunee for HTML5的学习与使用笔记(一)

    在CSDN中的第一篇博文就献给我学习了一段时间 xff0c 仍然在研究使用的Qunee吧 因为是在公司里面后接手的这个插件 xff0c 上一个使用的同事再简单交接了一下之后 xff0c 就离开公司了 xff0c 所以一切的依靠就只有官网啦
  • 在history模式下部署vue项目到tomcat服务器的踩坑经历【前端VUE+后端JAVA】

    前言 因为是要将之前用jq写的前端代码重构为基于vue下的项目 xff0c 又是第一次将vue运用起来 xff0c 所以真的可谓是一步一个坑 xff0c 今天先记一波部署的坑 vue项目源码中的修改 router默认的模式是hash xff
  • 页面跳转路径出现;JSESSIONID=XXX的问题【前端VUE+后端JAVA】

    前沿 后台的JAVA框架时在前后端没有分离的时候编写的 xff0c 因为修改起来工程量比较庞大同时也很复杂 xff0c 所以现阶段只是将前端用vue来重写项目框架 xff0c 来减轻项目的运行负担 在与后台结合的时候还是会出现一些运行冲突而
  • express的学习笔记(一)——server.address()

    前言 在跟这教程学习时 xff0c 遇到了一处和教程展示内容不相同的地方 xff0c 后进行修改得以一致 xff0c 遂进行记录 问题 教程中有段代码是这样得 var express 61 require 39 express 39 var
  • Intel RealSense实感深度摄像头自校准(Self-Calibration)步骤详细,D400系列适用

    喜提国庆8天工作乐 xff0c 改代码真的很帅 xff0c 才华皆一切 xff0c 这篇博客的由来是因为我做实验了 xff0c 然后摄像头的有效距离贼差 xff0c 打了技术人员的电话说他们的有效距离4m xff0c 然后边缘相差为百分之2
  • Anaconda导致的GMT安装报错

    这两天在使用gmt6 3 0绘制直方图时 xff0c 发现一旦使用其 L选项 xff0c 数据统计就是错误的 让同学帮忙用gmt6 2 0绘制时就没有这个错误 xff0c 于是决定卸载gmt6 3 0重装gmt6 2 0 在完成所有准备工作
  • 服务器能ping通,ssh却连不上

    问题现象 xff1a 1 原来用Xshell连着的窗口能正常操作 2 重新打开新的窗口却提示 xff1a Connecting to 192 168 36 61 22 Connection established To escape to

随机推荐

  • ubuntu-18.04 root登录图形界面失败问题解决方案

    1 设置ROOT密码 先输入当前所在用户密码 xff0c 然后输入你要设置的root密码 xff0c 输入两次即可 xff01 2 进入 etc pam d目录 主要修改两个文件 圈了红色框框 xff0c 记得命令行下切换root账户 su
  • 树莓派做飞控的四轴无人机

    为什么拿树莓派做飞控 市面上有很多机遇stm32的现成飞控和教程 我碰巧有做一个无人机的想法 xff0c 而且手上刚好有树莓派4b一个 树莓派支持pyrhon编程和实时调控 需要准备的材料 电流电压匹配的电机 电调和电池 我选择的是闲鱼买的
  • linux系统之根文件系统树制作

    前言 xff1a 很早就在linux下做过了uboot移植 xff0c linux内核移植以及文件系统的制作 xff0c 一直没有来得及总结 xff0c 现在好好把之前做过的东西整理一下 xff0c 主要是为了备忘 现在总结一下根文件系统树
  • 二级必会词汇

    形容词 xff08 xff11 xff09 xff11 惜 xff12 xff1a 怪 xff13 xff1a 嬉 xff14 xff1a 悲 xff15 xff1a 厳 xff16 xff1a 悔 xff17 xff1a 苦 xff18
  • python学习-isinstance()

    isinstance 是一个内置的函数 xff08 BIF xff09 它允许某个特定标识符是否包含某个特定类型的数据 如判断某个对象是不是列表 字典 整型等 gt gt gt a 61 1 2 3 gt gt gt b 61 123 gt
  • Ubuntu上安装PX4

    文字教程 视频教程 在Win10上安装虚拟机 VMware Workstation 16 Pro xff0c 在虚拟机安装18 04版ubuntu xff0c 其他版本可能安装不成功 xff0c 之前我20版本就安装失败 下列步骤开始前 x
  • stm32 红外遥控实现

    一 概述 红外遥控采用NEC协议 定时中断 预分频器采用72 xff0c 72M 72 61 1M xff0c 每秒1千次 xff0c 一次1us xff0c 即第1us计数器加1 溢出值设为10000 xff0c 即10ms xff0c
  • 关于simulink中的函数function模块

    前言 xff1a 我们前面提到过当遇到库中没有我们需要的模块时 xff0c 我们可以自己书写s函数 xff0c 其实s函数是一个比较高端的工具 xff0c 是用来书写一些比较复杂的模块 xff0c 而遇到一些简单的模块 xff0c 我们可以
  • px4飞行数据.ulg文件的分析

    参考 xff1a https blog csdn net walk2011 article details 83757139 以及 xff1a https blog csdn net qq 42570955 article details
  • offboard代码超详细注释

    这一部分主要对服务做了特别详细的讲解 span class token macro property span class token directive keyword include span span class token stri
  • offboard模式的全球位置发布

    例子中的代码控制的是飞机的本地位置 xff0c 也就是相对起飞位置的位置 xff0c 而如果我们采用全球位置 xff0c 也就是经纬海拔坐标 xff0c 如何去书写呢 xff1f 发布全球位置 xff08 经纬海拔坐标 xff09 头文件
  • mavros的常用服务介绍

    在mavros中 xff0c 最常用的服务就两个 xff0c 一个是解锁 xff0c 还有一个就是模式切换 当然还有其他的服务 xff0c 比如通过mavros修改航点信息 xff0c 但是不常用 xff0c 所以下面只介绍解锁和模式切换
  • offboard模式实现简单四边航线并自动降落

    前言 xff1a 这一部分不想在重复写了 xff0c 已放在作者的github上 xff0c 偷个懒0 0
  • 测试offboard模式的安全代码

    这段代码用于检验offboard模式的安全启动 xff0c 执行后飞机只会轻微的旋转 xff0c 不会起飞 span class token comment span span class token comment Created by
  • offboard里的期望姿态

    消息体头文件 xff1a mavros msgs AttitudeTarget h 里面的内容 xff1a span class token macro property Message for SET ATTITUDE TARGET sp
  • shell脚本自学笔记

    一 什么是Shell脚本 shell脚本并不能作为正式的编程语言 xff0c 因为它是在linux的shell中运行的 xff0c 所以称为shell脚本 事实上 xff0c shell脚本就是一些命令的集合 假如完成某个需求需要一口气输入
  • matlab2020安装

    前言 xff1a 这里之所以要安装最新的2020版本 xff0c 是因为matlab中的硬件支持工具是随着版本变化而变化的 xff0c 所以要升级matlab版本 MATLAB R2020a v9 8 0 最新中文版 64位 百度网盘链接后
  • px4的电调校准

    我们之前校准电调的步骤为 xff1a 第一 xff0c 先打开遥控器 xff0c 油门推到最大 第二 xff0c 给飞控供电 xff0c 此时电调会捕捉到油门最大量程 第三 xff0c 保持遥控不变 xff0c 飞控断电 xff0c 然后再
  • px4源码备份

    这几天在用1 8 0版本的源码时发现了玄学的事情 xff0c 在终端下完美运行和仿真 xff0c 但是拿到simulink下运行仿真就会出现飞机一进去就乱飞 xff0c 并且你关了simulink之后再回终端 xff0c 发现原本在终端下可
  • 数据结构有关树的知识总结(一)

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