数据结构——线索化二叉树

#include <iostream>
using namespace std;

enum PiontFlag{LINK,THREAD};

template<class T>
struct BinaryTreeNode
{
    BinaryTreeNode(const T& data)
        :_data(data)
        ,_pLeft(NULL)
        ,_pRight(NULL)
        ,_leftThread(LINK)
        ,_rightThread(LINK)
    {}

    T _data;
    BinaryTreeNode<T>* _pLeft;
    BinaryTreeNode<T>* _pRight;
    PiontFlag _leftThread;
    PiontFlag _rightThread;
};

template<class T>
class BinaryTreeThd
{
    typedef BinaryTreeNode<T> Node;
public:
    BinaryTreeThd()
        :_pRoot(NULL)
    {}
    BinaryTreeThd(const T array[],size_t size,const T& invalid)
    {
        size_t index = 0;
        _CreateTree(_pRoot,array,size,index,invalid);
    }
    void PreThreading()
    {
        Node* prev = NULL;
        _PreThreading(_pRoot,prev);
    }
    void InThreading()
    {
        Node* prev = NULL;
        _InThreading(_pRoot,prev);
    }
    void PostThreading()
    {
        Node* prev = NULL;
        _PostThreading(_pRoot,prev);
    }
    void PreOrder()
    {
        cout<<"PreOrder()"<<endl;
        _PreOrder(_pRoot);
    }
    void InOrder()
    {
        cout<<"InOrder()"<<endl;
        _InOrder(_pRoot);
    }
private:
    void _CreateTree(Node*& pRoot,const T array[],size_t size,size_t& index,const T& invalid)
    {
        if(index<size && array[index]!=invalid)
        {
            pRoot = new Node(array[index]);
            _CreateTree(pRoot->_pLeft ,array,size,++index,invalid);
            _CreateTree(pRoot->_pRight ,array,size,++index,invalid);
        }
    }
    void _PreThreading(Node* pRoot,Node*& prev)//注意prev应传其引用否则带不回前值
    {
        if(pRoot)
        {
            //线索化当前节点的左指针域
            if(NULL == pRoot->_pLeft )
            {
                pRoot->_pLeft = prev;
                pRoot->_leftThread = THREAD;
            }
            //线索化前一个节点的右指针域
            if(prev && NULL == prev->_pRight )
            {
                prev->_pRight = pRoot;
                prev->_rightThread = THREAD;
            }
            prev = pRoot;
            if(LINK == pRoot->_leftThread )
                _PreThreading(pRoot->_pLeft ,prev);
            if(LINK == pRoot->_rightThread )
                _PreThreading(pRoot->_pRight ,prev);
        }
    }
    void _InThreading(Node* pRoot,Node*& prev)
    {
        if(pRoot)
        {
            if(LINK == pRoot->_leftThread )
                _InThreading(pRoot->_pLeft ,prev);

            //线索化当前节点的左指针域
            if(NULL == pRoot->_pLeft )
            {
                pRoot->_pLeft = prev;
                pRoot->_leftThread = THREAD;
            }

            //线索化前一个节点的右指针域
            if(prev && NULL == prev->_pRight )
            {
                prev->_pRight = pRoot;
                prev->_rightThread = THREAD;
            }
            prev = pRoot;
            if(LINK == pRoot->_rightThread )
                _InThreading(pRoot->_pRight ,prev);
        }
    }
    void _PostThreading(Node* pRoot,Node*& prev)
    {
        if(pRoot)
        {
            if(LINK == pRoot->_leftThread )
                _PostThreading(pRoot->_pLeft ,prev);
            if(LINK == pRoot->_rightThread )
                _PostThreading(pRoot->_pRight ,prev);
            //线索化当前节点的左指针域
            if(NULL == pRoot->_pLeft )
            {
                pRoot->_pLeft = prev;
                pRoot->_leftThread = THREAD;
            }
            //线索化前一个节点的右指针域
            if(prev && NULL == prev->_pRight )
            {
                prev->_pRight = pRoot;
                prev->_rightThread = THREAD;
            }
            prev = pRoot;
        }
    }
    void _PreOrder(Node* pRoot)
    {
        if(pRoot)
        {
            Node* pCur = pRoot;
            while(pCur)
            {
                while(LINK == pCur->_leftThread )
                {
                    cout<<pCur->_data <<" ";
                    pCur = pCur->_pLeft ;
                }
                cout<<pCur->_data <<" ";
                pCur = pCur->_pRight ;
                //while(THREAD == pCur->_rightThread )
                //{
                //  pCur = pCur->_pRight ;
                //  cout<<pCur->_data <<" ";
                //}
                //if(LINK == pCur->_leftThread )
                //  pCur = pCur->_pLeft ;
                //else
                //  pCur = pCur->_pRight ;
            }
        }
    }
    void _InOrder(Node* pRoot)
    {
        Node* pCur = pRoot;
        while(pCur)
        {
            while(pCur->_leftThread == LINK)
                pCur = pCur->_pLeft ;
            cout<<pCur->_data <<" ";
            while(THREAD == pCur->_rightThread )
            {
                pCur = pCur->_pRight ;
                cout<<pCur->_data <<" ";
            }
            pCur = pCur->_pRight ;
        }
    }
private:
    Node* _pRoot;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值