题目描述

现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度

输入描述:

输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成,
下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号

输出描述:

输出树的高度,为一个整数
示例1

输入

5
0 1
0 2
1 3
1 4

输出

3

/*
题目有点小问题,测试用例存在多叉树但按照 AC 代码的意思要剔除这样的例子(-_-||
但我总结了一下对于这种输入如何构建一个多叉树,以及找出最大高度的方法
可能方法不是最好的,希望各位批评指正!!
对于题目中的输入
0 1
0 2
1 3
1 4
左边是父节点,右边是子节点
一个父亲可能有多个儿子,我这里用的是 map<int,queue<int> >来对应这种关系
以父亲节点的值为 key, 所对应的一个队列queue<int>里放着他所有的儿子
这样就建立好了基本的对应关系,找出最大高度的方法类似于广度优先遍历
一层一层向下迭代,详见代码
名词解释:
一个节点的高度:从该节点到一个树叶(没有儿子的节点)的最长距离
*/
#include<iostream>
#include<map>
#include<queue>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
map<int,queue<int> > G;//存储节点对应关系的 map
bool cmp(int a,int b)//自定义比较函数,对应sort的降序排列
{return a>b;
}
/*
获取最大高度的方法
*/
int getMax(int begin)       //函数传入的是根节点
{if(G[begin].empty())return 1;      //这是递归结束条件,即遍历到树叶(没有儿子的节点)返回高度 1 vector<int> v;        //一个节点有多个儿子,这是一个记录多个儿子高度的动态数组 while(!G[begin].empty())       //把每一个儿子的高度放进vector {int length = getMax(G[begin].front()) + 1;       //往下一层,高度 + 1 v.push_back(length);      //儿子节点的高度放入vector G[begin].pop();       //注意pop()遍历过的节点 }//求动态数组的最值 ,作为该节点的最大高度并返回sort(v.begin(),v.end(),cmp);//降序排序return v[0]; //第一个即为最大值
}
int main()
{freopen("input.txt","r",stdin);int a,b,n,begin;int num[1001]={0};while(~scanf("%d",&n)){//多叉图的构建 for(int i=0;i<n-1;i++){scanf("%d %d",&a,&b);G[a].push(b);num[b] = 1;      //散列思想,把所以儿子节点在数组 num里置 1,这样没被置 1的就是根节点 }//根节点的获取//遍历 num数组,不是 1的就是根节点 for(int i=0;i<n;i++){if(num[i]==0){begin = i;break;}} //遍历树的最大高度printf("%d\n",getMax(begin)); //放入根节点 memset(num,0,sizeof(num));    //多组输入,初始化全局变量 }return 0;
}

多叉树的构建和树的高度的计算相关推荐

  1. vbn中使用的3种流程控制结构是_细菌进化树构建:从模式种序列下载到构建系统发育树一键搞定...

    细菌进化树 • 构 建 细菌进化树构建:从模式种序列下载到构建系统发育树一键搞定 对于细菌新种或者新属的发现,总是那么让人期待,但是当我们批量获得16S序列后,逐一对这些尚不知分类地位的序列进行比对并 ...

  2. 创建父需求子需求构建需求树_还不知道B+树 ?看完,别再问我什么是B+树 了

    前言 每当我们执行某个 SQL 发现很慢时,都会下意识地反应是否加了索引,那么大家是否有想过加了索引为啥会使数据查找更快呢,索引的底层一般又是用什么结构存储的呢,相信大家看了标题已经有答案了,没错!B ...

  3. 二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度

    文章目录 前言 创建二叉树 先序遍历 中序遍历 后序遍历 获取叶子节点个数 获取树的高度 测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基 ...

  4. 树的高度从零还是一开始数_数据结构与算法之1——树与二叉树

    数据结构一直是让人头疼,面试遇到手撕算法题时真是慌得不行,从啥也不会刷题刷到游刃有余,路漫漫其修远兮~~.本人还是个算法菜鸟,而且还是想转行互联网的半吊子(好想拿大厂offer啊,幻想中..),希望能 ...

  5. 【数据结构】AVL树(高度平衡的二叉搜索树)

    AVL树(高度平衡的二叉搜索树) ①AVL树概念 ②平衡方法 <1>单旋 左单旋 右单旋 <2>双旋 先左后右旋 先右后左旋 ③代码实现 <1>所需头文件 < ...

  6. b树 b树特点 画图构建b树

    b树 一.b树的特点 b树允许每个节点包含多个k值,如果我们构建一个M阶b树,那么他的特点是: 每个节点最多有M-1个k值,并按照升序排列 每个节点最多有M个子节点 根节点至少有两个子节点 如上图为4 ...

  7. 从Chrome源码看浏览器如何构建DOM树

    最近下了Chrome的源码,安装了一个debug版的Chromium研究了一下,虽然很多地方都一知半解,但是还是有一点收获,将在这篇文章介绍DOM树是如何构建的,看了本文应该可以回答以下问题: IE用 ...

  8. java建树_JAVA实现通过中序遍历和后序遍历序列建树,并求树的高度,用层次遍历做验证...

    作为例子的树长这样: package bstpractice; import java.util.ArrayList; import java.util.Arrays; import java.uti ...

  9. 常见数据结构详细图解、树的高度、深度、层数、跳表、二叉搜索树、平衡二叉树、红黑树、B树、B+树

    常见数据结构 常用的数据结构知识. 1.1 跳表 上图是一个有序链表,我们要检索一个数据就挨个遍历.如果想要再提升查询效率,可以变种为以下结构: 现在,我们要查询11,可以跳着来查询,从而加快查询速度 ...

最新文章

  1. Unity插件之NGUI学习(4)—— 创建UI2DSprite动画
  2. Wind River Helix系统及物联网解决方案 简化企业IOT部署
  3. 无法解析的外部符号的几种可能(lib方面的)(还有dll方面的,不在本文中)...
  4. ConTeXt 标题前后的空白
  5. matlab练习程序(TV模型图像修复)
  6. LA 4728 (旋转卡壳) Squares
  7. corn java 可配置_定时任务工具——CronUtil
  8. mysql status uptime_MySQL优化(四) 慢查询的定位及优化
  9. C++/C中的小知识备忘
  10. tarjan算法 转载
  11. 智鼎逻辑推理题及答案_校园招聘在线测试笔试题型的种类和解题技巧
  12. python判断是否有弹出窗口_使用Python爬取弹出窗口信息的实例
  13. mysql写保护,sd卡有写保护怎么格式化
  14. ipv6单播地址包括哪两种类型_Ipv6详解
  15. Python下selenium的get()方法大量时间超时报错TimeOut
  16. leetcode 155. Min Stack最小栈(中等)
  17. 好的商城系统都是这个样子的
  18. VIII openstack(2)
  19. 网页播放器自定义倍速播放
  20. re2c源码下载及编译

热门文章

  1. VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本,请确保该脚本没有错误。您也可以提交支持请求,报告此问题。
  2. FSL之bet颅骨剥离
  3. poi生成excel整理(设置边框/字体/颜色/加粗/居中/)
  4. vscode 开发 Java web 急速教程
  5. 项目管理(如何进行团队管理)
  6. mysql数据库--mysql的数据类型(数值型)
  7. 没有鼠标就无法对计算机进行操作,电脑鼠标不灵敏是什么原因?怎么解决?
  8. jquery获取ip地址
  9. Android10power有哪些功能,Android 功耗(10)---电流波形图(power monitor)
  10. 不用科学梯子下载mokee-mkq-mr1分支安卓10.0源码