题目描述
现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度
输入描述:
输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成,
下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号
输出描述:
输出树的高度,为一个整数
示例1
输入
5
0 1
0 2
1 3
1 4
输出
3
现学现卖啦.vector可真好用,万能。以后多多训练,嘻嘻。
#include<iostream>
#include<vector>
using namespace std;
int main(void){
int n,H=1;
int f,c,h;
vector<int>node(1000,0); //存放节点的有效高度
node[0]=1; //至少有一个节点,高度值是1
vector<int>child(1000,0); //存放孩子节点数
cin>>n;
while(--n){ //n次循环读取
cin>>f>>c;
if(node[f]==0||child[f]==2) //如果父结点为空或其子节点已为2(剔除多余分支)
continue;
child[f]+=1;
h=node[f]+1;
node[c]=h;
if(h>H) H=h;
}
cout<<H;
return 0;
}
更新:
今日又回顾了一下这道题,突然觉得似乎没有用vector的必要。因为题目已给出了n <= 1000,对于定长类型,用vector反而降低效率,不如直接用数组。如下:
#include<iostream>
#include<vector>
using namespace std;
int main(void){
int n,H=1;
int f,c,h;
int node[1000];
node[0]=1;
int child[1000];
cin>>n;
while(--n){
cin>>f>>c;
if(node[f]==0||child[f]==2)
continue;
child[f]+=1;
h=node[f]+1;
node[c]=h;
if(h>H) H=h;
}
cout<<H;
return 0;
}
果然,编译之后发现运行时间和占用内存都有所下降。
下面贴出使用矢量与直接使用数组的区别:
vector适用于多线程,比较安全,但速度比较慢
数组占用的资源更小,就像你用string和char 数组的道理是一样的用更底层的速度更快,方便性没写好的string好用而以而且要搞清楚一个关系,没有数组,哪来的向量
我再补充一点数组是栈上分配空间,vector是堆上分配空间
数组是C++语法里规定的基本数据类型。而vector本身并不是C++的一部分,是属于C++标准库提供的功能,是一群C++大牛们写出来的给C++菜鸟们使用的东东。如果你是大牛,那么你也可以写出一个东东来取代vector
动态内存管理,不易出错!
其实vector和数组一样,只能存储单一的数据类型,它的另一个主要的好处是可以动态的增长长度,
定义一个vector类型的变量时,并不需要指定它的容量是多少,如果有需要,只管往里面push数据。
vector会为你自动管理这些数据。
我们在程序中可能经常要用到数组,但有时候我们可能并不知道自己的程序中具体用到数组的大小(比如说,我们读一个文件记录,根据记录多少调整数组的大小,事先并不知道到底有多少记录),这种情况下,传统上是用动态数组实现的,这样不怎么安全.但有了vector我们就不必关心数组的大小,而直接声明为vector<type_name>array_name,其中,type_name为你要定义的数组类型,array_name为数组变量名,当你需要往数组中放数据时,只需要用如下格式array_name.push(要放入的数据),vector会自动调整数组大小,要减小数组大小,可以用如下格式array_name.pop();
至于效率,没怎么注意过,但是感觉数组效率应该比vector高,vector只是使用
起来比较方便。
数组的效率比Vector要高,Vector用起来要比数组方便。
楼上说的已经很好了!我在补充一点
数组在内存中分配的连续空间,多次分配释放后会有内存碎片,
而vectors是动态增长的,不是连续的,所以不会出现内存碎片
还有vector的迭代器能防止出现类似数组愈界等等 动态申请内存。