ZZULI 1209  二叉树(2)

来源:互联网 发布:微博域名怎么改 编辑:程序博客网 时间:2024/04/29 19:26

二叉树(2)

Time Limit:1000MS  MemoryLimit:65536K
Total Submit:69 Accepted:29

Description

1、按扩展的先序序列(即包括空结点,1表示空结点)输入二叉树的各结点,建立二叉树,

ZZULI <wbr>1209 <wbr> <wbr>二叉树(2)

输出包括两行,第一行为该二叉树的高度,第二行按自左至右的顺序输出所有叶子结点,各字符后有一空格

Input

输入有多组实例,每组实例占一行

Output

每组结果占两行,第一行为该二叉树的高度,第二行按自左至右的顺序输出所有叶子结点,各字符后有一空格

SampleInput

ABD111CE11F11

SampleOutput

3D E F

Source

李老师

这个题目和1208非常相像,只是略有不同而已,判断高度的就不用再说了,定义一个全局变量,有更深的则记下,最后就是节点的深度了,

而输出叶子的则比较麻烦,一直没能想出来一个可以和求节点深度一起求解的方法,所以只能,另外又开了一个函数,有点儿浪费时间,唉,浪费时间就是浪费生命啊!

代码:

#include<stdio.h>
#include<stdlib.h>
char str[1001];
int flag[1001];
int top,max;
typedef struct tree{
    chardata;
    struct tree*left,*right;
}node,*Lnode;
int m=sizeof(node);
Lnode newnode()
{
    Lnodep;
   p=(Lnode)malloc(m);
   p->left=NULL;
   p->right=NULL;
    returnp;
}
void build(Lnode p)
{
    Lnodes,q;
   if(str[top]=='1'||str[top]==0){
      p->data='1';
      return;
    }
    else {
      p->data=str[top];
      s=newnode();
      p->left=s;
       top++;
      build(s);
    }
   q=newnode();
   p->right=q;
    top++;
   build(q);
}
void look(Lnode p,int i)
{
   if(p->data!='1')
    {
       i++;
      if(max<i)
          max=i;
      if(p->left->data=='1'&&p->right->data=='1')
         str[top++]=p->data;
    }
    elsereturn;
   look(p->left,i);
   look(p->right,i);
}
int main()
{
    Lnoderoot;
    int i;
   while(gets(str))
    {
       top=0;
      root=newnode();
      build(root);
      max=0;top=0;
      look(root,0);
      printf("%d\n%c",max,str[0]);
      for(i=1;i<top;i++)
          printf("%c",str[i]);
      printf("\n");
    }
    return0;
}

原创粉丝点击