中序线索二叉树


/*中序线索二叉树*/

#include <iostream>

using namespace std;

typedef char ElemType;

struct TTreeNode
{
	ElemType data;
	TTreeNode *left;
	TTreeNode *right;
	int ltag;
	int rtag;
};

//对二叉树进行中序线索化即建立中序线索
void InThread(TTreeNode *HT)
{
	static TTreeNode *pre = NULL;  //指向前驱结点,用以保存刚访问过的结点指针
	if(HT != NULL)
	{
		if(HT->ltag == 0)
			InThread(HT->left);   //当左子树非空时,给左子树加中序线索
		if(pre != NULL && pre->rtag == 1)
			pre->right = HT;   //给前驱结点加后继线索
		if(HT->left == NULL)
		{
			//给当前结点加前驱线索
			HT->ltag = 1;
			HT->left = pre;
		}
		if(HT->right == NULL)
			HT->rtag = 1;   //给右指针域为空的结点加右线索标记
		pre = HT;   //把刚访问过的当前结点置为前驱结点
		if(HT->rtag == 0)
			InThread(HT->right);   //当右子树非空时,给右子树加中序线索
	}
}

//在中序线索二叉树上求结点p的中序后继结点
TTreeNode* InOrderNext(TTreeNode *p)
{
	if(p->rtag == 1)
		return p->right;
	p = p->right;
	while(p->ltag == 0)
		p->left;
	return p;
}

//线索二叉树的中序遍历
void ThInOrder(TTreeNode *HT)
{
	if(HT != NULL)
	{
		while(HT->ltag == 0)
			HT = HT->left;
		do
		{
			cout<<HT->data<<" ";
			HT = InOrderNext(HT);
		}
		while(HT != NULL);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值