7-9 列出所有祖先结点 (30分)

对于给定的二叉树,本题要求你按从上到下顺序输出指定结点的所有祖先结点。

输入格式:
首先第一行给出一个正整数 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45845039/article/details/111568336