问题描述:

现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度 
输入描述: 
输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成, 
下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号 
输出描述: 
输出树的高度,为一个整数

示例1 
输入


0 1 
0 2 
1 3 
1 4 
输出

3

解题思路:

思路一:根据题目要求,依据父子关系建立一颗合法的二叉树,然后再利用递归得出树的高度。

但是再测试用例时有的用例会使用多叉树,这个算法不适用。而且多叉树在进行运算时,只能取前面两个分支,要忽略后面的分支。

源代码:

/*建立二叉树求解问题*/
#include<iostream>
using namespace std;
typedef struct Node
{struct Node *lchild;struct Node *rchild;int val;
}BiTree,*LinkTree;int flag;     //判断函数递归是否结束 //求树的高度
int getTreeHeight(LinkTree rootNode){  if(rootNode==NULL) return 0;  int nLeft = getTreeHeight(rootNode->lchild);  int nRight = getTreeHeight(rootNode->rchild);  return (nLeft>nRight)?(nLeft+1):(nRight+1); }//依据节点建树void CreatTree(LinkTree root,int father,int childVal){//  cout<<"CreatTree"<<endl;//root->lchild=NULL;//cout<<childVal<<" "<<father<<endl; if(root==NULL) return;    // cout<<"Compare:"<<root->val<<" "<<father<<endl;if(root!=NULL&&root->val==father){//      cout<<"INIT"<<endl;if(root->lchild==NULL)        //如果左子树为空,则建立左子树 {root->lchild=new(BiTree);root->lchild->val=childVal;root->lchild->lchild=NULL;root->lchild->rchild=NULL;    //左右节点赋空 flag=1;}else                           //否则则建立右子树,因为合法,故非左即右 {//  cout<<"rchild"<<endl;root->rchild=new(BiTree);root->rchild->val=childVal;root->rchild->lchild=NULL;root->rchild->rchild=NULL;flag=1; }return;}if(flag==0)                                             //设置标记,防止无限调用循环,而且会减少函数调用的次数 {CreatTree(root->lchild,father,childVal);             //类似于深度优先,若一层不行,则往深入遍历 CreatTree(root->rchild,father,childVal);}else return;
}int main()
{int n,height;cin>>n;LinkTree root=new(BiTree);root->val=0;root->lchild=NULL;//Creat(root,root->val,)for(int i=0;i<n-1;i++){flag=0; int father;int childVal;cin>>father>>childVal;            CreatTree(root,father,childVal);}//cout<<root->val<<endl;//cout<<root->rchild->val<<endl;//cout<<root->rchild->val<<endl;height=getTreeHeight(root);cout<<height;return 0;
}

思路二:通过递归关系的到深度,即子节点的深度等于父节点的深度加一。而从根节点开始,依次通过节点关系,来得出每一层的节点的深度。

核心代码:

/*父节点的深度加一就是子节点的深度,从0开始一次往下遍历*/
/*0的深度为1,一次以此为基础向下遍历,则可得到最终深度 */
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;int main()
{int n;int temp;int BiHeight=0;                       //the resultint result[10000]={1};vector<vector<int> > count;           //to creat a array cin>>n;             for(int i=0;i<n-1;i++){vector<int> MiddleUse;cin>>temp;      MiddleUse.push_back(temp);cin>>temp;MiddleUse.push_back(temp);count.push_back(MiddleUse);         //input the array}sort(count.begin(),count.end());        //sort to calculate//for(int i=0;i<n;i++)//cout<<count[i][0]<<" "<<count[i][1]<<endl;for(int i=0;i<n-1;i++){//  cout<<count[i][1]<<endl;result[count[i][1]]=result[count[i][0]]+1;      //int the base of the count[0][0]BiHeight=max(BiHeight,result[count[i][1]]);     //to work out the depth}//cout<<count[0][0]<<result[1]<<result[2]<<result[3];cout<<BiHeight<<endl;
}

此为两种两种计算深度的方式,其中第一种思路适用于所有已经建立的树,第二种适合与这种节点的关系来求深度。

小米笔试题 依据父子关系建树相关推荐

  1. 【小米笔试题】朋友圈问题-并查集解法

    2016年小米校招笔试第三题(西安站) 3 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共 ...

  2. 并查集——小米笔试题求朋友圈个数,分小组个数

    先给出小米的题: 已知有n个人和m对好友关系(存于数组r).如果两个人是直接或间接的好友(好友的好友的好友-),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈. 假如:n = 5 ...

  3. 【小米笔试题】实现一个算法,确定一个字符串的所有字符是否全部不同

    实现一个算法,确定一个字符串的所有字符是否全部不同. 下面给出3种可行方法,都经过测试.(其中方法一,刚开始理解有些困难,需要多思考一下) package XiaoMi;import java.uti ...

  4. 【小米笔试题】二分查找算法的变形

    一个有序数组的元素经过循环移动,元素的顺序可能变为"3 4 5 6 7 1 2".怎样才能找出数组中最小的那个元素?假设数组中的元素各不相同. 方法一:(暴力遍历)时间复杂度o(n ...

  5. 小米笔试题:无序数组中最小的k个数

    题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...

  6. 小米校园招聘笔试题--括号智能纠错

    一 问题描述: 二 解题思路: 因为要对括号序列进行插入操作,所以选择链表作为序列的数据结构,在判断括号序列是否合法时,要用到堆栈,所以选择堆栈用以存放左半括号 三 代码: /* This is a ...

  7. 小米运维部14年校招笔试题A的个人答案

    15年准备实习生面试时答的题,仅供参考 具体题目详见  http://www.tuicool.com/articles/eYRZBr http://noops.me/?p=1154 一.linux基础 ...

  8. 【求职】小米 2018 秋招测试开发工程师笔试题

    小米 2018 秋招测试开发工程师笔试题 一.单选题 1.静态变量static 在不同的实例中地址是否一样?他们储存在什么区域?( ) A. 地址一样,在堆栈区. B. 地址不一样,在堆栈区. C. ...

  9. 【2022小米秋招(2023校招)】软件开发方向 笔试题1——链表反转

    题目: 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表. 输 ...

最新文章

  1. 安装win下的Anaconda ----针对python3.6.4版本
  2. 5分钟快速打造WebRTC视频聊天转
  3. Centos7修改主机名
  4. 汇川am600运动指令详解_汇川中型PLC AM400系列产品型号说明及功能介绍
  5. Linux学习之十二-Linux文件属性
  6. C语言正则表达式regex
  7. IDEA:生成javadoc/断点调试/缓存和索引的清理
  8. 谷歌在外贸中的实战解析
  9. Sampling-Argmax:用重参数技巧优化Soft-Argmax
  10. Editplus 使用技巧大全
  11. 单路视频编码器怎么使用
  12. 机器学习系列文章:Apriori关联规则分析算法原理分析与代码实现
  13. alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝
  14. 招聘海报制作可以用什么软件,有什么免费模板?
  15. Arduino基础入门篇01—进入Arduino的世界
  16. R语言学习笔记:使用reshape2包实现整合与重构
  17. vue中 @scroll的使用
  18. SpringBoot集成Elasticsearch7.4 实战(一)
  19. 闲话复数(1) | 不现实的虚数 i 为什么虚?它长成什么样?
  20. 【电源】【PCB】电源板(提供±2v5,3v3,5v,12v供电)的制作——电赛使用

热门文章

  1. 计算机英语第3版课后单词,计算机专业英语课后单词
  2. LeetCode 312.戳气球
  3. c语言中如何转换矩阵,2020-07-06(C语言)矩阵转换
  4. zipline中TradingCalendar源码分析
  5. FAQ of db2fmp messages in the db2diag.log
  6. 网络钓鱼活动从虚假应用转向供应链攻击
  7. 计算机专业学生如何应聘教师岗位
  8. linuxprobe第一弹
  9. TCP四次挥手详解以及小实验
  10. Windows搭建MQTT服务器