SDUT 2136、2137 二叉树的建立与各种遍历

暑假就没看二叉树这块。

2136 

数据结构实验之二叉树的建立与遍历

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2136

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 #include<stdlib.h>

 4 struct node

 5 {

 6     int data;

 7     struct node *l,*r;

 8 };

 9 struct node *t;

10 int count=0;

11 struct node *creat(struct node *t)//建树

12 {

13     char ch;

14     scanf("%c",&ch);

15     if(ch==',')

16     {

17         return NULL;

18     }

19     else

20     {

21         t=(struct node*)malloc(sizeof(struct node));

22         t->data=ch;

23         t->l=creat(t->l);

24         t->r=creat(t->r);

25     }

26     return t;

27 }

28 void inorder(struct node *t)//中序遍历

29 {

30     if(t)

31     {

32         inorder(t->l);

33         printf("%c",t->data);

34         inorder(t->r);

35     }

36 }

37 void postorder(struct node *t)//后序遍历

38 {

39     if(t)

40     {

41         postorder(t->l);

42         postorder(t->r);

43         printf("%c",t->data);

44     }

45 }

46 void leaf(struct node *t)//求叶子节点

47 {

48     if(t)

49     {

50         if(t->l==NULL&&t->r==NULL)

51         count++;

52         leaf(t->l);

53         leaf(t->r);

54     }

55 }

56 int deep(struct node *t)//求深度

57 {

58     int lchild,rchild;

59     if(!t)

60     return 0;

61     lchild=deep(t->l);

62     rchild=deep(t->r);

63     return lchild>rchild?lchild+1:rchild+1;

64 }

65 int main()

66 {

67     struct node *s;

68     int num;

69     s=creat(t);

70     inorder(s);

71     printf("\n");

72     postorder(s);

73     printf("\n");

74     leaf(s);

75     printf("%d\n",count);

76     num=deep(s);

77     printf("%d\n",num);

78     return 0;

79 }

2137

数据结构实验之求二叉树后序遍历和层次遍历

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2137

BFS一直不大会用。唉。

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 #include<stdlib.h>

 4 struct node

 5 {

 6     char data;

 7     struct node *l,*r;

 8 };

 9 struct node *t;

10 struct node *creat(char *pre,char *in ,int len)//建立二叉树

11 {

12     int k;

13     if(len<=0)

14     return NULL;

15     struct node *head;

16     head=(struct node*)malloc(sizeof(struct node));

17     head->data= *pre;

18     char *p;

19     for(p=in;p!=NULL;p++)

20     {

21         if(*p == *pre)

22         break;

23     }

24     k=p-in;

25     head->l=creat(pre+1,in,k);

26     head->r=creat(pre+k+1,p+1,len-k-1);

27     return head;

28 }

29 void postorder(struct node *t)//后序遍历

30 {

31     if(t)

32     {

33         postorder(t->l);

34         postorder(t->r);

35         printf("%c",t->data);

36     }

37 }

38 void lorder(struct node *t)//层次遍历

39 {

40     int front=0,rear=1,ans[100],n=0,i;

41     struct node * q[100];

42     q[0]=t;

43     while(front<rear)

44     {

45         t =q[front++];

46         ans[n++]=t->data;

47         if(t->l!=NULL) q[rear++]=t->l;

48         if(t->r!=NULL) q[rear++]=t->r;

49     }

50     for(i=0;i<n;i++)

51     {

52         printf("%c",ans[i]);

53     }

54 }

55 int main()

56 {

57     struct node *h;

58     int n,len;

59     char pre[100],in[100];

60     h=(struct node*)malloc(sizeof(struct node));

61     scanf("%d",&n);

62     while(n--)

63     {

64         scanf("%s%s",pre,in);

65         len=strlen(pre);

66         h=creat(pre,in,len);

67         postorder(h);

68         printf("\n");

69         lorder(h);

70         printf("\n");

71     }

72     return 0;

73 }

74 /*从先序遍历中读入根节点;然后从中序遍历中找到与根节点相等的元素,将中序序列分成两个部分,左边的为二叉树的左子树,右边为二叉树的右子树;最后递归调用得到根节点的左右子树*/

你可能感兴趣的:(二叉树)