线索二叉树threadBinTree

本文介绍了一种线程二叉树的数据结构实现方法,包括创建线程二叉树、中序遍历等功能,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件:

#ifndef _THREADBINTREE_H

#define _THREADBINTREE_H
typedef enum{LINK,THREAD}Tag;
template<class Type>
class BinTree;
template<class Type>
class BinTreeNode
{
friend BinTree<Type>;
public:
BinTreeNode(Type d=Type()):leftChild(NULL),rightChild(NULL),ltag(LINK),rtag(LINK),data(d)
{}
~BinTreeNode()
{}
private:
Type data;
BinTreeNode<Type> *leftChild;
BinTreeNode<Type> *rightChild;
Tag   ltag;
Tag   rtag;
};
template<class Type>
class BinTree
{
public:
BinTree(Type ref):root(NULL),refval(ref)
{}
void create_tree(const char *&str)
{
    create_tree(root,str);
}
void create_tree(BinTreeNode<Type> *&t,const char *&str)
{
if(*str==refval)
    t=NULL;
    else
    {
        t=new BinTreeNode<Type>(*str);
        create_tree(t->leftChild,++str);
        create_tree(t->rightChild,++str);
    }
}
void create_threadBinTree();
void create_threadBinTree(BinTreeNode<Type> *&t,BinTreeNode<Type> *&pre);
void InOrder()const
{
    InOrder(root);
}
void InOrder(BinTreeNode<Type> *t)const
{
    if(t!=NULL)
    {
        InOrder(t->leftChild);
        cout<<t->data<<"  ";
        InOrder(t->rightChild);
    }
}
BinTreeNode<Type>* first();
BinTreeNode<Type>*first(BinTreeNode<Type>*t);
BinTreeNode<Type>* last();
BinTreeNode<Type>* last(BinTreeNode<Type> *t);
BinTreeNode<Type>* next(BinTreeNode<Type> *cur);
BinTreeNode<Type>* prior(BinTreeNode<Type> *cur);
void inorder();
void inorder(BinTreeNode<Type> *t);
BinTreeNode<Type>*parent(BinTreeNode<Type> *cur);
BinTreeNode<Type>* parent(BinTreeNode<Type> *t,BinTreeNode<Type> *cur);
~BinTree()
{
    //
}
private:
BinTreeNode<Type> *root;
Type refval;
};
template<class Type>
void BinTree<Type>::create_threadBinTree()
{
    BinTreeNode<Type> *pre=NULL;
    create_threadBinTree(root,pre);
    pre->rightChild=NULL;
    pre->rtag=THREAD;
}
template<class Type>
void BinTree<Type>::create_threadBinTree(BinTreeNode<Type>*&t,BinTreeNode<Type> *&pre)
{
    if(t==NULL)
    return ;
        create_threadBinTree(t->leftChild,pre);
        if(t->leftChild==NULL)
        {
            t->leftChild=pre;
            t->ltag=THREAD;
        }
        if(pre!=NULL&&pre->rightChild==NULL)
        {
            pre->rtag=THREAD;
            pre->rightChild=t;
        }
        pre=t;
        create_threadBinTree(t->rightChild,pre);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::first()
{
    first(root);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::first(BinTreeNode<Type>*t)
{
    if(t==NULL)
    return NULL;
    while(t->ltag==LINK)
    t=t->leftChild;
    return t;
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::last()
{
    last(root);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::last(BinTreeNode<Type> *t)
{
    if(t==NULL)
        return t;
    while(t->rtag==LINK)
        t=t->rightChild;
    return t;
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::prior(BinTreeNode<Type> *t)
{
    if(t==NULL)
    return NULL;
    if(t->rtag==THREAD)
    return t->leftChild;
    else
    return first(t->leftChild);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::next(BinTreeNode<Type>*t)
{
    if(t==NULL)
        return NULL;
    if(t->rtag==THREAD)
        return t->rightChild;
    else
        return first(t->rightChild);
}
template<class Type>
void BinTree<Type>::inorder()
{
    inorder(root);
}
template<class Type>
void BinTree<Type>::inorder(BinTreeNode<Type> *t)
{
    for(t=first(t);t!=NULL;t=next(t))
        cout<<t->data<<"  ";
        cout<<endl;
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::parent(BinTreeNode<Type> *cur)
{
    parent(root,cur);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::parent(BinTreeNode<Type> *t,BinTreeNode<Type> *cur)
{
    if(cur==NULL)
    return NULL;
    if(cur->ltag==THREAD)
        if(cur->leftChild->leftChild==cur||cur->leftChild->rightChild==cur)
        return cur->leftChild;
    if(cur->rtag==THREAD)
        if(cur->rightChild->leftChild==cur||cur->rightChild->rightChild==cur)
        return cur->rightChild;
    if(prior(first(cur->leftChild))!=NULL&&prior(first(cur->leftChild))->rightChild==cur)
    return prior(first(cur->leftChild));
    if((next(last(cur->leftChild))!=NULL)&&next(last(cur->rightChild))->leftChild==cur)
    return next(last(cur->rightChild));
}
#endif


测试文件:test.cpp

#include"./utility.h"
#include"./threadBinTree.h"
int main()
{
BinTree<char> bt('#');
    const    char *ch="ABC##DE##F##G#H##";
    bt.create_tree(ch);
    bt.InOrder();
    cout<<endl;
    bt.create_threadBinTree();
    bt.first();    
    bt.last();
    bt.prior(bt.last());
    bt.next(bt.next(bt.first()));
    bt.inorder();
    bt.parent(bt.next(bt.first()));
    bt.parent(bt.next(bt.next(bt.next(bt.first()))));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值