⽤vector数组实现树的存储(孩⼦表示法)c++
在我们遇到的算法题中, ⼀般给出的树结构都是有编号的,这样会简化我们之后存储树的操作 ,⼀般提供两个信息;⼀共9个结点셈 1号结点为根节点,接下来8⾏,每⾏两个数x, y, 表示x, y之间有⼀条边输⼊格式:93 11 24 12 56 27 44 84 9。
·
在我们遇到的算法题中, ⼀般给出的树结构都是有编号的,这样会简化我们之后存储树的操作 ,⼀般提供两个信息;
- 结点的个数 n;
- n-1条x结点与y结点相连的边
题⽬描述:
⼀共9个结点셈 1号结点为根节点,接下来8⾏,每⾏两个数x, y, 表示x, y之间有⼀条边
输⼊格式:
9
3 1
1 2
4 1
2 5
6 2
7 4
4 8
4 9
我们观察下,它告诉我们两个数的时候,⽐如3 1之间有⼀条边,并没有告诉我们谁是⽗结点谁是孩⼦结点,虽然这道题⾥⾯我们知道1是根结点,1就是⽗亲,3就是孩⼦,但是它每⾏告诉我们的顺序并没有⽗⼦关系,在看第5⾏的2 5,并不知道2是⽗亲还是5是⽗亲,所以这道题虽然告知了根结点,但是还是要当作⽆根数处理,因为我们基本上是看不出⽗⼦关系的。
接下来我们⽤vector数组来实现孩⼦表示法
1.创建⼀个⼤⼩⾜够的vector数组,vector<int> edges[10];(注意这⾥是[]不是(),如果是(),相当于你创建了⼀个vector数组且⾥⾯的空间为10,但是你写成[],相当于我们创建了10个vector数组)其中 edges[i]⾥⾯就存着i号结点的所有孩⼦
2.对于i的孩⼦,直接edges[i].push_back
我们⽤图像来表示上⾯的话,模拟⼀下把左边的逻辑结构存到edges数组⾥⾯(⽐如3号下标⾥⾯的 vector数组,它以后要存储6号结点的孩⼦信息)

#include<iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int n;
vector<int> edges[N]; //´æ´¢Ê÷
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
int a, b; cin >> a >> b;
edges[a].push_back(b);
edges[b].push_back(a);
}
return 0;
}
更多推荐
所有评论(0)