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

//二叉线索树
//每个节点存储了它在某种遍历顺序下的前驱和后继节点的位置,所以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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值