二叉树的线索化

5.3.2 二叉树的线索化

1782286767593

1782286914400

#include<stdio.h>
//中序遍历 
void InOrder(BiTree T){
	if(T!=NULL){
		InOrder(T->lchild);//递归遍历左子树 
		visit(T);//访问根节点 
		InOrder(T->rchild);//递归遍历右子树 
	}
} 

//访问结点q 
void visit(BiTNode * q){
	if(q==p)//当前访问结点刚好是结点p 
		final = pre;//找到p的前驱 
	else
		pre = q;//pre指向当前访问的结点 
} 

//辅助全局变量,用于查找结点p的前驱 
BiTNode *p;//p指向目标节点 
BiTNode * pre=NULL;//指向当前访结点的前驱 
BiTNode * final=NULL; //用于记录最终结果

 

1782288488583

//线索二叉树 
typedef struct ThreadNode{
	ElemType data;
	struct ThreadNode *lchild,*rchild;
	int ltag,rtag; //左右线索标志 
}ThreadNode,* ThreadTree; 

//中序遍历 
void InThread(ThreadTree T){
	if(T!=NULL){
		InThread(T->lchild);//递归遍历左子树 
		visit(T);//访问根节点 
		InThread(T->rchild);//递归遍历右子树 
	}
} 

void visit(ThreadNode *q){
	if(q->lchild==NULL){//左子树为空,建立前驱线索 
		q->lchild=pre;
		q->ltag=1;
	}
	if(pre!=NULL&&pre->rchild==NULL){
		pre->rchild=q;//建立前驱结点的后继线索 
		pre->rtag=1;
	}
	pre=q;
}
//全局变量 pre 指向当前访问结点的前驱 
ThreadNode *pre =NULL;

1782290266308

//全局变量pre,指向当前访问结点的前驱 
ThreadNode *pre=NULL;

//中序线索化二叉树T 
void CreatInThread(ThreadTree T){
	pre=NULL;//pre初始为NULL 
	if(T!=NULL){//非空线索化才能线索化 
		InThread(T);//中序线索化二叉树 
		if(pre->rchild==NULL)
			pre->rtag=1;//处理遍历的最后一个结点 
	}
} 

//线索二叉树 
typedef struct ThreadNode{
	ElemType data;
	struct ThreadNode *lchild,*rchild;
	int ltag,rtag; //左右线索标志 
}ThreadNode,* ThreadTree; 

//中序遍历 
void InThread(ThreadTree T){
	if(T!=NULL){
		InThread(T->lchild);//中序遍历左子树 
		visit(T);//访问根节点 
		InThread(T->rchild);//中序遍历右子树 
	}
} 


void visit(ThreadNode *q){
	if(q->lchild==NULL){//左子树为空,建立前驱线索 
		q->lchild=pre;
		q->ltag=1;
	}
	if(pre!=NULL&&pre->rchild==NULL){
		pre->rchild=q;//建立前驱结点的后继线索 
		pre->rtag=1;
	}
	pre=q;
}

1782290744488

1782290792511

1782294456855

1782294461651

1782294484523

1782294492940

1782294506857

1782294545499

1782294550064

posted @ 2026-06-24 17:52  轻狂书生han  阅读(3)  评论(0)    收藏  举报