PAT List Leaves

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 }

 

你可能感兴趣的:(list)