poj1577Falling Leaves--二叉排序树

来源:互联网 发布:刘文展 举报事件知乎 编辑:程序博客网 时间:2024/06/13 09:08

题目大意:给出一系列字串,最后一个是树根,建立一颗二叉排序树,先序输出二叉排序结果。

方法一:数组存储二叉树

#include<cstdio>  #include<cstring>  #include<iostream>  using namespace std;  struct node  {      int lc, rc;      char data;  }tree[100];  char str[100];  int num;  void insert(int p,char data)  //插入节点{      if(tree[p].data==0){         tree[p].data=data;         return ;      }     else               if(tree[p].data<data){               if(!tree[p].rc)  tree[p].rc=++num;              insert(tree[p].rc,data);           }           else  {               if(!tree[p].lc)  tree[p].lc=++num;              insert(tree[p].lc,data);           }  }  void dlr(int p)  //先根遍历{      if(tree[p].data==0)  return;    printf("%c",tree[p].data);     if(tree[p].lc)         dlr(tree[p].lc);      if(tree[p].rc)         dlr(tree[p].rc);  }  int main()  {    while(scanf("%s",str)>0){          int len=strlen(str);      char ch;      num=1;  //数组序号,模拟指针    memset(tree,0,sizeof(tree));      for(; ;) {         scanf("%c",&ch);         if(ch>='A'&&ch<='Z')              str[len++]=ch;          else                         if(ch=='*'||ch=='$')  break;     }     for(int i=len-1;i>=0;i--)          insert(1,str[i]);      dlr(1);      printf("\n");      if(ch=='$') break;    }  return 0;  }  


方法二,指针

#include<cstdio>  #include<cstring>  #include<iostream>  using namespace std;  struct node  {         char data;         node *lc,*rc;    }*tree;  char str[100];    void insert(node * &p,char data)  {   //注意这里参数的传递,tree是树的根节点,                                                //这里参数传递用了参数的地址传递,p与tree共同指向同一个地址空间    if(p==NULL){         node *q=new node;       q->data=data;       q->lc=q->rc=NULL;        p=q;             return;     }      else {             if(p->data<data)             insert(p->rc,data);           else              insert(p->lc,data);                                      }}  void dlr(node *p)  {       if(p==NULL)  return;      printf("%c",p->data);      dlr(p->lc);      dlr(p->rc);  }  int main()  {  freopen("in.txt","r",stdin);  while(scanf("%s",str)>0) {          int len=strlen(str);      char ch;          for(; ;) {          scanf("%c",&ch);          if(ch>='A'&&ch<='Z')               str[len++]=ch;          else                        if(ch=='*'||ch=='$')  break;      }                   tree=NULL;    for(int i=len-1;i>=0;i--)                   insert(tree,str[i]);        dlr(tree);      printf("\n");     if(ch=='$') break;    }   return 0;  }  


插入也可以用带返回值的函数

node *insert(node*p,char data)  {       if(p==NULL){         node *q=new node;       q->data=data;       q->lc=q->rc=NULL;        return q;      }      else {             if(p->data<data)            p->rc=insert(p->rc,data);           else             p->lc=insert(p->lc,data);                      return p;                     }}  


引用函数的用法:

tree=NULL;       for(int i=len-1;i>=0;i--)         tree=insert(tree,str[i]);    //要赋值回来,要不tree还是null  

 

0 0