线索二叉树

在二叉树的2n个链中,有n+1个空链。用线索即指向其他结点的指针来利用这些空链。

1.左儿子为空,将指向左儿子的指针指向中序遍历的前驱结点

2.右儿子为空,将指向右儿子的指针指向中序遍历的后继结点

使用left_threadright_thread来标记当前结点的左右指针指向线索还是左右儿子。

结点结构如下:

typedef struct node{
	struct node *left;    
	struct node *right;  
	int data;            
	short int left_thread;  
	short int right_thread;  
}BinaryNode;



将二叉树线索化

需要使用一个全局变量pre记录中序遍历的前一个结点.

若当前结点p的左儿子为空,p->left=pre,p->left_thread=1

pre的右儿子为空,pre->right=p,pre->right_thread=1 (pre的后继必须在访问p时才能确定)


二叉树第一个访问的结点的left指针和最后一个访问的right指针的线索不确定,需要添加一个总的头指针,使不确定的线索指向该指针。将头结点的right指向该二叉树。

BinaryNode *pre=NULL;

void ThreadInOrder(BinaryNode *p){
	if(p){
		ThreadInOrder(p->left);
		if(p->left==NULL){
			p->left=pre;
			p->left_thread=1;
		}
		if(pre->right==NULL){
			pre->right=p;
			pre->right_thread=1;
		}
		pre=p;
		ThreadInOrder(p->right);
	}
}

BinaryNode* ThreadRoot(BinaryNode *tree){
	BinaryNode *root;
	root=(BinaryNode *)malloc(sizeof(BinaryNode));
	root->left=root;
	root->right=tree;
	root->right_thread=0;
	root->left_thread=1;
	pre=root;
	ThreadInOrder(tree);
	pre->right=root;
	pre->right_thread=1;
	return root;
}

查找某一个结点的后继结点

如果该结点pright_thread1,则p->rightp的后继

否则为p的右子树沿着左儿子链的最后一个结点即left_thread1的结点

BinaryNode* FindSucceed(BinaryNode *tree){
	BinaryNode *succ=tree->right;
	if(tree->right_thread==0){
		while(succ->left_thread==0)
			succ=succ->left;
	}
	return succ;
}

中序非递归遍历

void InOrder(BinaryNode *root){
	BinaryNode *p;
	p=root;
	while(1){
		p=FindSucceed(p);
		if(p==root)
			break;
		printf("%d\t",p->data);
	}
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值