对于给定的二叉树,本题要求你按从上到下顺序输出指定结点的所有祖先结点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。
随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
最后一行给出一个结点的编号i(0≤i≤N-1)。
输出格式:
在一行中按规定顺序输出i的所有祖先结点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 -
- 6
- -
0 5
- -
4 1
- -
4
输出样例:
3 5
这道题不难,并查集思想吧,一直找祖先,增设parent域即可。一直25分,最小n那个测试点过不去,我以为如果要查询的是根结点(只有一个结点的情况),输出0或者’-’,结果是直接return 0就行了
#include <iostream>
#include <vector>
using namespace std;
typedef struct {
int parent;
int left;
int right;
} Node;
int main() {
int n;
cin >> n;
char left, right;
bool vis[n] = {
false};
Node node[n];
for (int i = 0; i < n; i++) {
cin >> left >> right;
if (left != '-') {
vis[left - '0'] = true;
node[i].left = left - '0';
node[left - '0'].parent = i;
} else {
node[i].left = -1;
}
if (right != '-') {
vis[right - '0'] = true;
node[i].right = right - '0';
node[right - '0'].parent = i;
} else {
node[i].right = -1;
}
}
int root;
for (int i = 0; i < n; i++) {
if (!vis[i]) {
root = i;
node[i].parent = -1;
break;
}
}
int index;
cin >> index;
if (n == 1) {
return 0;
}
vector<int> v;
while (node[index].parent != -1) {
v.push_back(node[index].parent);
index = node[index].parent;
}
for (int i = v.size() - 1; i >= 0; i--) {
if (i == 0)
cout << v[i];
else
cout << v[i] << " ";
}
return 0;
}