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;
}
#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;
}
相关文章推荐
- day(3) Cocos2dx输出Log的两种方法
- 建一棵二叉树,能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数
- PHP输出Excel两种方法
- asp 输出 excel 两种方法
- 创建一个Rectangle类,添加width和height两个成员变量。 2.在Rectangle中添加两种方法分别计算矩形的周长和面积 3.编程利用Rectangle输出一个矩形的周
- 用PHP输出静态页面的两种方法
- 二叉树的高度 java 利用递归和层次遍历两种方法
- maven获取svn版本号并输出到MANIFEST.MF的两种方法
- 两种获取HDC的方法和TextOut输出
- 创建一个Rectangle类,添加width和height两个成员变量 在Rectangle中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周
- Cocos2dx输出Log的两种方法
- php中两种将查询的内容输出写入到一本文本日志中的方法
- C:C语言前序创建二叉树的两种方式和前序遍历二叉树的方法
- PHP输出CSV和EXCEL两种简单的方法
- 二叉树的先序、中序、后序的非递归遍历(分别用两个栈和一个带标志位的栈两种方法去做)和层次遍历
- Flex 输出文件到本地的两种方法
- 用PHP输出静态页面的两种方法
- NOJ 1430 组合的输出 (组合数的排列,两种方法)
- asp.net实现图片以二进制流输出的两种方法
- asp.net实现图片以二进制流输出的两种方法