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

我先用的是把中跟输出的结果放到数组里,然后输出它的前面的和后面的

#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值