/**
* 对二叉树进行线索化时使用到的,中序遍历二叉树
*/
void BiThr::inThreading(BiThrNode *treeNode)
{
	//我们递归对这个二叉树进行中序遍历
	if (treeNode != nullptr)
	{
		//中序遍历,优先遍历左子树
		inThreading(treeNode->lchild);
		if (treeNode == nullptr)
		{
			//如果上面的递归结束,到了叶子节点,或者左边已经是空节点了,那么我们就把他进行线索化,指向前驱
			treeNode->lchild = pre;
			treeNode->LTag = BiThrNode::PointerTag::Thread;
		}//if
		//在设定新的前驱之前,我们前面一个前驱的后继就是当前的节点
		if (pre->rchild == nullptr)
		{
			pre->rchild = treeNode;
			pre->LTag = BiThrNode::PointerTag::Thread;
		}//if
		//左边结束,中间
		pre = treeNode;

		//最后右边
		inThreading(treeNode->rchild);
	}//if
}
/**
*  把线索二叉树进行线索化
*/
void BiThr::inOrderThreading()
{
	//我们先创建一个空的头结点,左边用来指向我们的二叉树的根,右边指向最后一个元素
	BiThrNode *pHead = new BiThrNode();
	pHead->LTag = BiThrNode::PointerTag::Link;
	pHead->rchild = pHead;	//先暂时把右边指向自己因为我们不知道,二叉树是否存在
	pHead->RTag = BiThrNode::PointerTag::Thread;
	//接下来判断二叉树是否存在
	if (Thrt == nullptr)
	{
		//如果二叉树不存在
		pHead->lchild = pHead;	//全都指向自己
	}//if
	else
	{
		pre = pHead;	//最开始的前驱,就是空的头节点
		pHead->lchild = Thrt;	//左边指向根
		inThreading(Thrt);	//把二叉树进行线索化
		//最后我们的前序(pre)在线索化之后,指向的是遍历到的中序的最后一个节点
		pre->rchild = pHead;
		pre->RTag = BiThrNode::PointerTag::Thread;
		//最后我们的头结点的右边指向最后一个二叉树的节点
		pHead->rchild = pre;
	}//else

	//最后得到新的头结点
	Thrt = pHead;
}
Пример #3
0
void inorderThreading(BiTTree T,BiTTree &p)
{
	p = (BiTTree)malloc(sizeof(BiTNode));
	if(!p) exit(0);
	else
	{
		p->ltag = Link;
		p->rtag = Thread;
		p->rchild = p;
	}
	if(!T)
	{
		p->lchild = p;
	}
	else
	{
	
		p->lchild = T;
		pre = p;
		inThreading(T);
		pre->rchild = p;   /*最后处理工作*/ 
		pre->rtag = Thread;
		p->rchild = pre;
	}
	
}
Пример #4
0
void inThreading(BiTTree T)
{
	if( T )
	{
		inThreading(T->lchild);   //先序遍历左子树 
		if(!T->lchild)
		{
			T->ltag = Thread;
			T->lchild = pre;
		}
		if(!pre->rchild)
		{
			pre->rtag = Thread;
			pre->rchild = T;
		}
	
		pre = T; 
		
		inThreading(T->rchild);   //先序遍历右子树 
	}
}