您的位置:首页 > 其它

zzuli 1210 二叉树(3) 用线索化二叉树和中跟输出两种方法

2011-07-23 09:35 465 查看
我先用的是把中跟输出的结果放到数组里,然后输出它的前面的和后面的
#include<stdio.h>
#include<stdlib.h>
typedef struct tree
{
char c;
struct tree *l,*r;
}t,*lt;
char s[10100];
int i=0;
lt h;
lt sol()//建立二叉树
{
lt cur=(lt)malloc(sizeof(t));
cur->c=s[i++];
if(cur->c=='1')
{
free(cur);
return NULL;
}
cur->l=sol();
cur->r=sol();
return cur;
}
void zhong(lt p)//把中跟输出到s中
{
if(p)
{
zhong(p->l);
s[i++]=p->c;
zhong(p->r);
}
}

int main()
{
gets(s);

i=0;
h=sol();
i=0;
zhong(h);
int n,j;
char cc;
scanf("%d",&n);
while(n--)
{
getchar();
cc=getchar();
for(j=0;j<i;j++)
if(s[j]==cc)
break;
if((j-1)<0)
printf("1 ");
else printf("%c ",s[j-1]);
if((j+1)==i)
printf("1\n");
else printf("%c\n",s[j+1]);
}

return 0;
}后来有看了看线索二叉树,就用那个又写了一边,因为看了一点,不太熟悉,代码写的有点复杂(查找sc尤其乱,后面有个修改版)
第一次看线索化二叉树,在网上搜的,用上面给的线索化代码写了,咋调都不过,后来看书,原来网上那代码有BUG,最右侧节点的右指针覆盖不到。
劣质资料害死人啊。#include<stdio.h>
#include<stdlib.h>
typedef struct tree
{
char c;
struct tree *l,*r;
int ll,rr;
}t,*lt;
char s[1010];
char sc;
int i=0;
lt h,pr,q,ppp;
lt sol()//建立二叉树
{
lt cur=(lt)malloc(sizeof(t));
cur->c=s[i++];
if(cur->c=='1')
{
free(cur);
return NULL;
}
cur->l=sol();
cur->r=sol();
return cur;
}
void zhong(lt p)//中序线索化二叉树
{
if(p)
{
zhong(p->l);
if(p->l)
p->ll=0;
else
p->ll=1;
if(p->r)
p->rr=0;
else
p->rr=1;
if(pr)
{
if(pr->rr==1)
pr->r=p;
if(p->ll==1)
p->l=pr;
}
pr=p;
zhong(p->r);
}
}
lt cha(lt p)//查找p->c==sc的节点
{
lt op;
if(p)
{
if(p->c==sc)
return p;
if(p->ll)
{}
else
{
op=cha(p->l);
if(op)
return op;
}
if(p->rr)
{}
else
{
op=cha(p->r);
if(op)
return op;
}
return NULL;
}
return NULL;
}
void qian(lt p)//输出p节点的前驱
{
lt rr;
if(p->ll==1)
{
q=p->l;
}
else
{
rr=p->l;
while(rr->rr==0)
rr=rr->r;
q=rr;
}
if(q)
printf("%c ",q->c);
else printf("1 ");
}
void hou(lt p)//输出p节点的后继
{
lt rr;
if(p->rr==1)
{
q=p->r;
}
else
{
rr=p->r;
while(rr->ll==0)
rr=rr->l;
q=rr;
}
if(q)
printf("%c\n",q->c);
else printf("1\n");
}
int main()
{
int n,j;
gets(s);
i=0;
h=sol();
zhong(h);
scanf("%d",&n);
for(j=1;j<=n;j++)
{
getchar();
sc=getchar();
ppp=cha(h);
qian(ppp);
hou(ppp);
}
return 0;
}修改版#include<stdio.h>
#include<stdlib.h>
typedef struct tree
{
char c;
struct tree *l,*r;
int ll,rr;
}t,*lt;
char s[1010];
char sc;
int i=0;
lt h,pr,q,ppp;
lt sol()//建立二叉树
{
lt cur=(lt)malloc(sizeof(t));
cur->c=s[i++];
if(cur->c=='1')
{
free(cur);
return NULL;
}
cur->l=sol();
cur->r=sol();
return cur;
}
lt qian(lt p)//输出p节点的前驱的地址
{
lt rr;
if(p->ll==1)
{
q=p->l;
}
else
{
rr=p->l;
while(rr->rr==0)
rr=rr->r;
q=rr;
}
return q;
}
lt hou(lt p)//输出p节点的后继地址
{
lt rr;
if(p->rr==1)
{
q=p->r;
}
else
{
rr=p->r;
while(rr->ll==0)
rr=rr->l;
q=rr;
}
return q;
}
void zhong(lt p)//中序线索化二叉树
{
if(p)
{
zhong(p->l);
if(p->l)
p->ll=0;
else
p->ll=1;
if(p->r)
p->rr=0;
else
p->rr=1;
if(pr)
{
if(pr->rr==1)
pr->r=p;
if(p->ll==1)
p->l=pr;
}
pr=p;
zhong(p->r);
}
}
lt cha(lt p)//查找p->c==sc的节点
{
if(p)
{
while(p->ll==0)
{
if(p->c==sc)
return p;
p=p->l;
}
while(p)
{
if(p->c==sc)
return p;
p=hou(p);
}
}
return NULL;
}
int main()
{
int n,j;
gets(s);
i=0;
h=sol();
zhong(h);
scanf("%d",&n);
for(j=1;j<=n;j++)
{
getchar();
sc=getchar();
ppp=cha(h);
pr=qian(ppp);
if(!pr)
printf("1 ");
else
printf("%c ",pr->c);
pr=hou(ppp);
if(!pr)
printf("1\n");
else
printf("%c\n",pr->c);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tree null struct c
相关文章推荐