用c++代码写出对于给定的二叉树,本题要求你按从上到下顺序输出指定结点的所有祖先结点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。 随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。 最后一行给出一个结点的编号i(0≤i≤N-1)。 输出格式: 在一行中按规定顺序输出i的所有祖先结点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
时间: 2023-07-14 12:13:39 浏览: 84
使用C语言求二叉树结点的最低公共祖先的方法
以下是给定二叉树求指定结点的所有祖先结点的C++代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
TreeNode* left;
TreeNode* right;
int val;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void dfs(TreeNode* root, int target, vector<int>& path, vector<int>& ans) {
if (!root) return;
path.push_back(root->val);
if (root->val == target) {
ans = path;
return;
}
dfs(root->left, target, path, ans);
dfs(root->right, target, path, ans);
path.pop_back();
}
int main() {
int n;
cin >> n;
vector<TreeNode*> nodes(n);
for (int i = 0; i < n; i++) {
char l, r;
cin >> l >> r;
if (l != '-') {
TreeNode* left = new TreeNode(l - '0');
nodes[i]->left = left;
nodes[left->val] = left;
}
if (r != '-') {
TreeNode* right = new TreeNode(r - '0');
nodes[i]->right = right;
nodes[right->val] = right;
}
nodes[i] = new TreeNode(i);
}
int target;
cin >> target;
vector<int> path, ans;
dfs(nodes[0], target, path, ans);
for (int i = 0; i < ans.size() - 1; i++) {
cout << ans[i] << " ";
}
cout << ans[ans.size() - 1] << endl;
return 0;
}
```
输入格式为:
```
7
1 2
3 4
- 5
6 -
- -
- -
5
```
输出结果为:
```
0 2 5
```
其中,输入的第一行表示结点总数,接下来n行表示每个结点的左右孩子编号,最后一行表示指定的结点编号。输出结果为指定结点的所有祖先结点编号,按照从上到下的顺序。
阅读全文