二叉树是树结构中的重要概念,一些特殊的二叉树如满二叉树和完全二叉树由于节点序号的特殊关系,在一些算法中十分常见。

这篇文章将从三个方面介绍有关二叉树的知识点:

(1)   普通有序树转化为二叉树。

(2)   计算二叉树路径。

(3)   通过两种遍历确定二叉树结构。

一.普通有序树转化为二叉树

其实不仅限于有序树,森林转化成二叉树也是利用了这里给出的方法。

左子女-右兄弟法:

1)     T中节点与T’中一一对应,即T中每一个节点的序号的值在T’中保持不变。

2)     T中某节点v的第一个儿子节点为v1,则在T’中v1为对应节点v的左儿子。

3)     T中节点v的儿子序列(即v1节点的兄弟序列),在T’中依次链接成一条开始与v1的右链。

Ex1(poj3437):

用du字符串的形式(d是down的缩写,u是up的缩写,该字符串描述了先序遍历有序树的方向变化,间接描述的树结构)表征,现在要求我们求解有序树的高度及其转化成二叉树后的高度。

首先我们明确一个知识点,根据普通有序树转化成二叉树的方法,我们可以得到这样一个公式:对于节点x及其在有序树中的父节点y,我们设level(i)代表节点i在二叉树中的层次(根节点是第0层),那么有level(x) = level(y) + son_th.其中son_th表示x是y的第几个儿子。因此我们在算法设计中,首先递归设计算法统计有序树的层数,中间设置变量tempson来记录当前节点是其有序树中的父节点中的第几个儿子,顺便就可以求出二叉树的层次。

代码如下:

#include<cstdio>

#include<string>

#include<iostream>

#include<algorithm>

using namespace std;

string s;

int i , n =  , height1 , height2;

void work(int level1 , int level2){//递归计算树高,每次函数调用表示我们在两种树种遍历到同一节点,这一节点在有序树和二叉树中的层次分别是level1 , level2

   int tempson = ;//该节点的儿子序列计数器置零

   while(s[i] == 'd'){//如果当前方向向下,说明有儿子

      i++;

      tempson++;

      work(level1 +  , level2 + tempson);//基于儿子节点递归调用函数

   }

    //完成了该节点所有子节点的递归函数调用,维护层数最大值

   height1 = max(height1 , level1);

   height2 = max(height2 , level2);

   i++;

}

int main(){

      while(cin >> s && s != "#"){

         i = height1 = height2 = ;

         work( , );

         cout << "Tree "<<++n<<":"<<height1 <<" => "<<height2<<endl;

      }

}

二.计算二叉树的路径

在一些题目中往往要求我们在二叉树中的某条路径上行遍以获得一些信息。完全二叉树就是一种非常利于我们行遍路径的结构。设我们有n节点的完全二叉树,且姐弟拿笔拿好是从上而下从左而右递增分布的,则任意分支节点i的父节点是floor((i-1)/2);若节点i有左儿子则左儿子的节点序号是2i+1,若节点i有右儿子,则节点序号为2i+2.

Ex1:

假设我们有一个二叉树,根节点标识为(1,1),其左儿子被标识为(2 , 1),右节点被标识为(1,2)。抽象得说,若一个节点的标识为(a , b),则其左儿子的标识为(a + b , b),右儿子标识为(a , a+b).那么现在给出一个节点的标识(a , b),编程计算这个这个节点相对于根节点(1 ,1)向左移动了多少步,向右移动了多少步。

这里实际上就是给出了一种二叉树路径的一种生成机制。我们从已知标识的(a,b)开始分析。如果a>b,则显然一定是之前的某些节点向左移动了若干步,朴素来讲,我们基于(a,b),其父节点是(a – b , b),如果依然满足a-b > n,那么在走到其父节点(a – b – b ,b)。这一迭代扩成可以概括为:

If(a > b){

up = floor((a – 1 )/b).某个节点连续往左儿子走up步走到(a,b)

left += up;//更新

a -= up*b. //此时a一定是b的剩余系。但是a不会等于0,这也是为什么用(a-1)/b而不用a/b的原因。

}

对称的,b>a的情形也是一样,经过多次迭代运算,知道a = b = 1,说明路径已经行遍到了根节点。

参考代码如下:

#include<cstdio>

#include<string>

#include<iostream>

#include<algorithm>

using namespace std;

string s;

int i , n =  , height1 , height2;

void work(int level1 , int level2){//递归计算树高,每次函数调用表示我们在两种树种遍历到同一节点,这一节点在有序树和二叉树中的层次分别是level1 , level2

   int tempson = ;//该节点的儿子序列计数器置零

   while(s[i] == 'd'){//如果当前方向向下,说明有儿子

      i++;

      tempson++;

      work(level1 +  , level2 + tempson);//基于儿子节点递归调用函数

   }

    //完成了该节点所有子节点的递归函数调用,维护层数最大值

   height1 = max(height1 , level1);

   height2 = max(height2 , level2);

   i++;

}

int main(){

      while(cin >> s && s != "#"){

         i = height1 = height2 = ;

         work( , );

         cout << "Tree "<<++n<<":"<<height1 <<" => "<<height2<<endl;

      }

}

数据结构编程实验——chapter9-应用二叉树的基本概念编程的更多相关文章

  1. 数据结构编程实验——chapter8-采用树结构的非线性表编程

    关于树结构的非线性表编程在数据结构中可以说占据了半壁江山,其中涉及的知识点繁杂,但也是数据结构体现运算优化的核心所在,下面我们将较为初步且系统得讨论数据结构中一系列有关树的表示. 首先我们再次明确树的 ...

  2. 20172301 《Java软件结构与数据结构》实验二报告

    20172301 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...

  3. 2017-2018-2 1723《程序设计与数据结构》实验四 & 实验五 & 课程总结 总结

    作业地址 实验四作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1943 提交情况如图: 实验五作业:https://edu ...

  4. 20172301 《Java软件结构与数据结构》实验三报告

    20172301 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...

  5. 20172329 2018-2019 《Java软件结构与数据结构》实验三报告

    20172329 2018-2019-2 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...

  6. 20172329 2018-2019-2 《Java软件结构与数据结构》实验二报告

    20172329 2018-2019-2 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...

  7. 20172328《程序设计与数据结构》实验四 Android程序设计报告

    20172328<程序设计与数据结构>实验四 Android程序设计报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志 ...

  8. 20172328《程序设计与数据结构》实验三 敏捷开发与XP实践报告

    20172328<程序设计与数据结构>实验三 敏捷开发与XP实践报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强 ...

  9. 20172310 2017-2018-2 《程序设计与数据结构》实验三报告(敏捷开发与XP实践)

    20172310 2017-2018-2 <程序设计与数据结构>实验三报告(敏捷开发与XP实践) 课程:<程序设计与数据结构> 班级: 1723 姓名: 仇夏 学号:20172 ...

随机推荐

  1. 推荐一个Markdown数学公式编辑器——Haroopad & Mathjax

    要在Markdown里插入数学公式,如果没有好用的的引擎or编辑器,那么只能插入图片了,十分麻烦.这里推荐一个十分强大的数学公式引擎--Mathjax. 配置 有道云笔记目前不支持浏览MathJax公 ...

  2. Alpha版本冲刺(五)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  3. ASP.NET MVC 5.0 参考源码索引

    http://www.projky.com/asp.netmvc/5.0/Microsoft/AspNet/Mvc/Facebook/FacebookAppSettingKeys.cs.htmlhtt ...

  4. [转帖]PCI-E的部分知识

    PCI-E PCI-E全称是PCI Express,是新一代的总线接口.采用了目前业内流行的点对点串行连接,比起PCI以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线 ...

  5. [转帖]Cgroups 与 Systemd

    Cgroups 与 Systemd 大神的文章很牛B .. https://www.cnblogs.com/sparkdev/p/9523194.html 看不太懂 , 转帖一下 自己留着好好看呢. ...

  6. [日常工作] 应用服务器上面应该尽量少开各种应用 --Chrome 内存泄露 让应用服务器非常缓慢

    1. 前段时间修改 服务器的密码 导致应用程序的web site 启动有问题 ,打开chrome 查看了错误详细信息 但是忘记关了.. 今天反馈机器非常缓慢 简单看了下内存 吐血... 所以以后不能在 ...

  7. 原生Ajax函数

    前言 在日常工作中,我经常使用Jquery的Ajax来获取接口数据.这几天有一个的官网要制作,由于网站比较小,有一些与服务器通信的接口处理,并没有涉及到复杂的交互功能.为了可以减少加载Jquery库的 ...

  8. ASP.NET Core 2 学习笔记

    之前的ASP.NET网站,只要把*.html.*.css.*.jpg.*.png.*.js等静态文件放在项目根目录,默认都可以直接被浏览:但ASP.NET Core 小改了浏览静态文件的方式,默认根目 ...

  9. MySQL 5.6 & 5.7最优配置文件模板

    Inside君整理了一份最新基于MySQL 5.6和5.7的配置文件模板,基本上可以说覆盖90%的调优选项,用户只需根据自己的服务器配置稍作修改即可,如InnoDB缓冲池的大小.IO能力(innodb ...

  10. 从商用到开源:15个维度,全面剖析DB2与MySQL数据库的差异

    随着MySQL数据库的应用越来越广泛,DB2向MySQL数据库的迁移需求也越来越多.进行数据库之间迁移的时候,首先遇到的并且也是最基本最重要的就是两种数据库数据类型之间的转换. 相关阅读: 从商用到开 ...