//二叉线索树
//每个节点存储了它在某种遍历顺序下的前驱和后继节点的位置,所以Node类中需要添加
//preLink和nextLink两个指针,但是在中序遍历下,可以把未被利用的n+1个指针域用
//上来存下一访问节点的位置,但是需要增加leftTag和rightTag两个标记量区分是指向
//孩子还是指向遍历的前驱和后继
//Node类的数据类型
class ThreadNode{
public:
bool leftTag;
bool rightTag;
ThreadNode* lLink;
ThreadNode* rLink;
int item;
public:
ThreadNode() = default;
ThreadNode(int a);
};
ThreadNode::ThreadNode(int a) {item = a;
leftTag = rightTag = 0;
lLink = rLink = nullptr;}
//ThreadBinaryTree类
//这里构造方法和普通二叉树一样,直接一点一点连就好了
class ThreadBinaryTree{
public:
ThreadNode root;
public:
ThreadBinaryTree() = default;
ThreadBinaryTree(ThreadNode*);
void InOrder(ThreadNode * _root);
void InThread(ThreadNode *_root, ThreadNode* & pre);//线索化中序二叉树
};
//线索化二叉树
void ThreadBinaryTree::InThread(ThreadNode * _root,ThreadNode* & pre)//pre在函数递归调用的时候要保持
{
if(_root!= nullptr)
{
InThread(_root->lLink, pre);
if(_root->lLink == nullptr)
{
_root->lLink = pre;
_root->leftTag = 1;
}
if(pre && pre->rLink == nullptr)
{
pre->lLink = _root;
pre->rightTag = 1;
}
pre = _root;
InThread(_root->rLink, pre);
}
}