二叉搜索树(二叉穿线树)抽象结构以及线索化算法

来源:互联网 发布:2016人工智能论坛 编辑:程序博客网 时间:2024/06/11 01:32
//二叉线索树//每个节点存储了它在某种遍历顺序下的前驱和后继节点的位置,所以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);    }}