数据结构实验之二叉树七:叶子问题
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点)。请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点。
Input
输入数据有多行,每一行是一个长度小于
50
个字符的字符串。
Output
按从上到下从左到右的顺序输出二叉树的叶子结点。
Example Input
abd,,eg,,,cf,,, xnl,,i,,u,,
Example Output
dfg uli
Hint
Author
xam
#include <stdio.h> #include <string.h> #include <stdlib.h> struct node { char data; struct bitree *l,*r; }; char a[100],b[55];//a前序b中序 int l1,h1,l2,h2; int count; struct node *creat() //前序建立 { struct node *root; char c; c = a[l1++]; if(c == ',') return NULL; else { root = (struct node *)malloc(sizeof(struct node)); root->data = c; root->l=creat(); root->r=creat(); } return root; } struct node *creat2(int n,char *a,char *b)//前序中序建立 { struct node *root; int i; if(n == 0) return NULL; root = (struct node *)malloc(sizeof(struct node)); root->data=a[0]; for(i = 0;i < n;i++) { if(b[i] == a[0]) break; } root->l=creat2(i,a+1,b); root->r=creat2(n-i-1,a+i+1,b+i+1); return root; } struct node *creat3(int n,char *a,char *b)//中序后序建立 { struct node *root; int i; if(n == 0) return NULL; root = (struct node *)malloc(sizeof(struct node)); root->data=b[n-1]; for(i = 0;i < n;i++) { if(a[i] == b[n-1]) break; } root->l=creat3(i,a,b); root->r=creat3(n-i-1,a+i+1,b+i); return root; } void preorder(struct node *root) //前序遍历 { struct node *p; p = root; if(p!=NULL) { printf("%c",p->data); preorder(p->l); preorder(p->r); } } void inorder(struct node *root)//中序遍历 { struct node *p; p = root; if(p!=NULL) { inorder(p->l); printf("%c",p->data); inorder(p->r); } } void postorder(struct node *root)//后序遍历 { struct node *p; p = root; if(p!=NULL) { postorder(p->l); postorder(p->r); printf("%c",p->data); } } void lorder(struct node *t)//层次遍历 { if(!t) //考虑空树 return ; struct node *q[100000],*p; int f,r; q[1] = t,f=r=1; while(f<=r) { p = q[f]; f++; printf("%c",p->data); if(p->l!=NULL) { r++; q[r]=p->l; } if(p->r!=NULL) { r++; q[r]=p->r; } } } int treehight(struct node *t) //二叉数高度 { int h,lh,rh; if(t == NULL) { h = 0; } else { lh = treehight(t->l); rh = treehight(t->r); if(lh>rh) h = lh+1; else h = rh+1; } return h; } void leaf(struct node *t) //求叶子数 { if(t) { if((t->l==NULL)&&(t->r==NULL)) { count++; } leaf(t->l); leaf(t->r); } } void leavel(struct node *p) // 叶子结点 { if(p == NULL) return; int i = 0,n = 0; struct node *a[100000]; a[n++] = p; while(i < n) { if(a[i]) { if(a[i]->l==NULL&&a[i]->r==NULL) printf("%c",a[i]->data) ; if(a[i]->l!=NULL) a[n++] = a[i] -> l ; if(a[i]->r!=NULL) a[n++] = a[i] -> r ; } i++; } } int main() { int n,t; while(scanf("%s",a) != EOF) { l1=0; struct node *root; root = creat(a); leavel(root); printf("\n"); } return 0; }