吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 720|回复: 0
收起左侧

[求助] 构造中序线索二叉树,为什么最后只输出GMZ三个

[复制链接]
d173220523 发表于 2020-8-18 15:52
[C] 纯文本查看 复制代码
#include <iostream>
typedef struct ThreadNode{
	char data;
	struct ThreadNode *lchild,*rchild;
	int ltag,rtag;
}ThreadNode,*ThreadTree;
ThreadTree PrelnCreat(char* in, char* pre, int n){
	if(n == 0)
		return NULL;
	ThreadTree p = new ThreadNode;
	p->data = *pre;
	for(int i = 0;i < n; i++)
		if(in[i] == *pre)
			break;
		p->lchild = PrelnCreat(in, pre +1, i);
		p->rchild = PrelnCreat(in + i + 1, pre + i + 1, n - (i + 1));
		return p;
}
void InThread(ThreadTree &p,ThreadTree &pre){
	if(p!=NULL){
		InThread(p->lchild,pre) ; //递归,线索化左子树
		if (p->lchild==NULL) { //左子树为空,建立前驱线索
			p->lchild=pre;
			p->ltag=1;
		}
		if(pre!=NULL&&pre->rchild==NULL){
			pre->rchild=p; //建立前驱结点的后继线索
			pre->rtag=1;
		}
		pre=p;//标记当前结点成为刚刚访问过的结点
		InThread(p->rchild,pre);//递归,线索化右子树
	}//if(p!-NULL)
}
void CreatelnThread(ThreadTree T) {
	ThreadTree pre=NULL;
	if (T!=NULL) { //非空二叉树,线索化
		InThread(T,pre); //线索化二叉树
		pre->rchild=NULL;//处理遍历的最后一个结点
		pre->rtag=1;
	} 
}
ThreadNode *Firstnode(ThreadNode *p){
	while(p->ltag==0)
		p=p->lchild;//最左下结点(不一定是叶结点〉
	return p;
}
ThreadNode *Nextnode(ThreadNode *p){
	if(p->rtag==0) 
		return Firstnode(p->rchild);
	else 
		return p->rchild;//rtag==l 直接返回后继线索
}
void Inorder(ThreadNode *T) {
	for(ThreadNode *p=Firstnode(T);p!=NULL; p=Nextnode(p))
		printf("%c",p->data);
}
int main(){
	char* pr="GDAFEMHZ";
	char* in="ADEFGHMZ";
	ThreadTree t=PrelnCreat(in,pr,8);
	CreatelnThread(t);
	Inorder(t);
	//printf("%c",p->data);
	//printf("%d",xiangsi(t,t1));
	printf("\n"); 
	return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 13:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表