标签:
PAT List Leaves
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.
PAT题目地址 PAT List Leaves
mooc上说是比较基础的树题目 必做 网上c语言代码太少 都是c++的 我这篇是纯c的 初学者可以看看
首先理解下题目意思 我感觉题意比较模棱两可
第一行 给一个N 表示总共节点数
接下来N行 每行两个数据 表示某个父节点的两个子节点 如第0个节点 1 - 表示某个父节点的两个子节点为 1 和NULL 注意1代表的是节点序号
再比如第二个节点 0 - 那么这个节点就是第0个节点的父节点
然后我们要做的就是找出根节点 这个比较容易找 就是左右节点都没有出现过的序号 则是根节点 可以弄一个flag数组来标记一下
最后就是用一个队列来储存所有的节点 然后按层次检索每个节点 左右儿子为空则是叶节点
我的代码写的可能有点简陋 还能在优化
下面是AC代码
1 #include "stdio.h" 2 typedef struct 3 { 4 int left; 5 int right; 6 }Tree; 7 int main() 8 { 9 int n,i,j,root,cnt=0,k=1,flag1=0; 10 Tree tree[10]; 11 int flag[10]={0}; 12 char l,r; 13 int queue[30]; 14 scanf("%d",&n); 15 for(i=0;i<n;i++) 16 { 17 scanf(" %c %c",&l,&r); 18 if(l==‘-‘) 19 tree[i].left=-1; //若输入为- 则为NULL 用-1表示 20 else 21 { 22 tree[i].left=l-‘0‘; 23 flag[l-‘0‘]=1; //表示这个节点已经出现过 24 } 25 if(r==‘-‘) 26 tree[i].right=-1; 27 else 28 { 29 tree[i].right=r-‘0‘; 30 flag[r-‘0‘]=1; 31 } 32 33 } 34 for(i=0;i<8;i++) 35 { 36 if(flag[i]==0) //找出根节点 37 { 38 root=i; 39 break; 40 } 41 } 42 queue[0]=root; 43 i=1; 44 while(cnt<=n-1) //cnt 表示实际节点数 也就是不为NULL的节点 45 { 46 if(root !=-1) 47 { 48 queue[i++]=tree[root].left; //入队操作 这段代码建议调试看看数据才能明白 49 queue[i++]=tree[root].right; 50 cnt++; 51 } 52 else 53 queue[i]=-1; 54 root=queue[k++]; 55 56 57 } 58 59 for(j=0;j<i;j++) 60 { 61 if(queue[j]!=-1) 62 { 63 if(tree[queue[j]].left==-1 &&tree[queue[j]].right==-1 && flag1==1) 64 printf(" %d",queue[j]); 65 if(tree[queue[j]].left==-1 &&tree[queue[j]].right==-1 &&flag1==0) 66 { 67 printf("%d",queue[j]); 68 flag1=1; 69 } 70 71 } 72 } 73 74 }
标签:
原文地址:http://www.cnblogs.com/threezj/p/4514784.html