对于给定的二叉树,本题要求你按从上到下顺序输出指定结点的所有祖先结点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。
随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
最后一行给出一个结点的编号i(0≤i≤N-1)。
输出格式:
在一行中按规定顺序输出i的所有祖先结点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 -
- 6
- -
0 5
- -
4 1
- -
4
输出样例:
3 5
曾经的噩梦,和浙大mooc的配套题 List Leaves 很相似,但是刚刚入门基础不扎实,边抄边写写好久,最后还没写出来,只能一句一句的对比一句一句的抄,修修改改最后改成完完全全是别人的代码,现在回过头写类似的题目,轻松愉悦😋,希望之后我刷图形的时候也会有这感觉😂,废话不多说,直接上代码
示例代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct TNode BinTree;
struct TNode{
int Left;
int Right;
int parent;
};
void Create();
void Find();
BinTree T[10];
int N;
int main()
{
Create();
if(N > 1)
Find();
}
void Create()
{
int i;
char L,R;
scanf("%d",&N);
getchar();
for(i = 0; i < N; i++){
T[i].parent = -1;
T[i].Left = -1;
T[i].Right = -1;
}
for(i = 0; i < N; i++){
scanf("%c %c",&L,&R);
getchar();
if(L == '-'){
T[i].Left = -1;
}
else{
T[i].Left = L - '0';
T[T[i].Left].parent = i;
}
if(R == '-'){
T[i].Right = -1;
}
else{
T[i].Right = R - '0';
T[T[i].Right].parent = i;
}
}
}
void Find()
{
int a[N],n = 0,i,Root;
scanf("%d",&Root);
while(T[Root].parent != -1){
a[n] = T[Root].parent;
n++;
Root = T[Root].parent;
}
for(i = n-1; i >=0 ; i--){
if(i == n-1){
printf("%d",a[i]);
}
else{
printf(" %d",a[i]);
}
}
}