// ThreadTree.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
typedef enum Symbol
{
link,
Thread
}Symbl;
typedef struct tagTreeNode
{
int nData;
struct tagTreeNode *pleft,*pright; //左右子树
Symbl ltag,rtag; //左右线索标志
}TreeNode_S;
void InThreading(TreeNode_S *p, TreeNode_S *&pPre)
{
if (p)
{
InThreading(p->pleft, pPre); //左子树线索化
if (!p->pleft)
{
p->ltag = Thread;
p->pleft = pPre;
}
if (!pPre->pright)
{
pPre->rtag = Thread;
pPre->pright = p;
}
pPre = p;
InThreading(p->pright, pPre); //右子树线索化
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
//头结点.左子树指向根结点、右子树指向最后一个节点
TreeNode_S *pHeadNode = new TreeNode_S;
pHeadNode->nData = 0;
pHeadNode->pleft = NULL;
pHeadNode->pright = NULL;
pHeadNode->ltag = link;
pHeadNode->rtag = link;
//创建树节点
TreeNode_S *pNode1 = new TreeNode_S;
pNode1->nData = 1;
pNode1->pleft = NULL;
pNode1->pright = NULL;
pNode1->ltag = link;
pNode1->rtag = link;
TreeNode_S *pNode2 = new TreeNode_S;
pNode2->nData = 2;
pNode2->pleft = NULL;
pNode2->pright = NULL;
pNode2->ltag = link;
pNode2->rtag = link;
TreeNode_S *pNode3 = new TreeNode_S;
pNode3->nData = 3;
pNode3->pleft = NULL;
pNode3->pright = NULL;
pNode3->ltag = link;
pNode3->rtag = link;
TreeNode_S *pNode4 = new TreeNode_S;
pNode4->nData = 4;
pNode4->pleft = NULL;
pNode4->pright = NULL;
pNode4->ltag = link;
pNode4->rtag = link;
//建二叉树
pNode1->pleft = pNode2;
pNode1->pright = pNode3;
pNode2->pright = pNode4;
//二叉树线索化
pHeadNode->ltag = link;
pHeadNode->rtag =Thread;
pHeadNode->pright = pHeadNode; //开始右指针回指
if (!pNode1) //树空,则左指针回指
{
pHeadNode->pleft = pHeadNode;
}
else
{
pHeadNode->pleft = pNode1; //头结点的左孩子是根节点
TreeNode_S *pTemp = pNode1; //获取树根
TreeNode_S *pPre = pHeadNode;
InThreading(pTemp, pPre); //pPre必须引用方式改变
pPre->pright = pHeadNode;
pPre->rtag = Thread;
pHeadNode->pright = pPre; //右指针指向最后一个节点
}
TreeNode_S *p = pNode1;
//遍历
while (p != pHeadNode) //空树或者遍历完成相等
{
while (p->ltag == link)
p = p->pleft;
cout<<p->nData<<endl;
while (p->rtag == Thread && p->pright!= pHeadNode)
{
p = p->pright;
cout<<p->nData<<endl;
}
p = p->pright;
}
//释放资源
if (pNode1)
{
delete pNode1;
pNode1 = NULL;
}
if (pNode2)
{
delete pNode2;
pNode2 = NULL;
}
if (pNode3)
{
delete pNode3;
pNode3 = NULL;
}
if (pNode4)
{
delete pNode4;
pNode4 = NULL;
}
if (pHeadNode)
{
delete pHeadNode;
pHeadNode = NULL;
}
system("pause");
return 0;
}