二叉树线索化

本文介绍了二叉树的线索化,通过前序和中序线索化,使得非递归遍历无需借助栈或队列。线索化将二叉树转换为有序双向链表,便于访问。特别地,文章提供了中序线索化的迭代器实现,并附有验证代码。
摘要由CSDN通过智能技术生成

二叉树的线索化可以使得二叉树的非递归遍历不需借助栈或队列这种数据结构,最主要的是可以为之提供迭代器。线索化二叉树有三种方式:前序线索化、中序线索化、后序线索化(后序线索化需要三叉链结构)这里主要讲前序线索化和中序线索化,并为中序线索化提供迭代器。
线索化的思想就是将一颗二叉树遍历转换成有序双向链表进行访问。这样二叉树的节点结构就应该多一个前驱和后继的线索化标志。
这里写图片描述

这里写图片描述

节点结构
这里写图片描述

enum PointerType
{
    THREAD,
    LINK    
};

template<class T>
struct BinaryTreeThd
{
   
    BinaryTreeThd<T>* _left;
    BinaryTreeThd<T>* _right;
    T _data;
    PointerType _leftType;      //前驱
    PointerType _rightType;     //后继

    BinaryTreeThd(const T& x)    //节点初始化
        :_data(x),_left(NULL),_right(NULL),_leftType(NULL),_rightType(NULL)
    {}
};

下面来看二叉树线索化

template<class T>
class BinaryTreeThd
{
    typedef BinaryTreeThdNode<T> Node;
public:
    BinaryTreeThd(T* a,size_t n,const T& invalid)
    {
        size_t index;
        _root = CreaterTree(a, n, invalid,index);
    }

    Node* CreaterTree(T* a,size_t n,const T& invalid,size_t& index)
    {
        Node* root = NULL;
        if(index<n && a[index] != invalid)
        {
            root = new Node(a[index]);
            root->_left = CreaterTree(a,n,invalid,++index);
            root->_right = CreaterTree(a,n,invalid,++index);
        }
    }

    void InOrderThreading<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值