poj1577Falling Leaves--二叉排序树

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

方法一:数组存储二叉树

#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  

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值