线索二叉树可以这样理解:
1. PreCreate(): 对于线索二叉树的先序创建过程和一般二叉树的先序创建没有区别(都是建立结点,然后结点赋值)
2.InThread():中序线索化的过程就是在1.中创建的基础上贴上标签(即给Tag赋值)和给所有的空指针域赋值(中序顺序串起来).
3.InOrderThread():函数只是用来在2的基础上串上头结点以及对中序遍历的最后一个结点和头结点进行很好的契合.
4.以上三个函数的契合才是完成一个真正意义上的线索二叉树的创建.
#include<iostream>
using namespace std;
typedef char ElemType;
typedef enum { Link, Thread }PointType;
typedef struct BThrNode
{
ElemType data;
struct BThrNode *pLchild, *pRchild;
PointType LTag, RTag;
}BThrNode, *pBThrNode;
void PreCreate(pBThrNode &pT)
{
ElemType c;
cin >> c;
if (c == '#')
pT = NULL;
else
{
pT = new BThrNode;
pT->data = c;
PreCreate(pT->pLchild);
PreCreate(pT->pRchild);
}
}
pBThrNode pRe;//全局变量
void InThread(pBThrNode pCur)//中序递归线索化
{
if (pCur)
{
InThread(pCur->pLchild);//左子树线索化
if (!(pCur->pLchild))//前驱线索化