数据结构-二叉树模板

数据结构课上自己写了个二叉树类,后面一堆数据结构课的作业全是在这个代码上改的,有需求的自取。

普通二叉树

#include <iostream>
using namespace std;
template <class ElemType>
struct BinTreeNode
{
    ElemType data;
    BinTreeNode<ElemType> *leftChild;
    BinTreeNode<ElemType> *rightChild;
    BinTreeNode();
    BinTreeNode(const ElemType &d,BinTreeNode<ElemType> *lChild=NULL,BinTreeNode<ElemType> *rChild=NULL);
    BinTreeNode(const BinTreeNode<ElemType>& cpy);
};

template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode()    //无参构造
{
    leftChild=rightChild=NULL;
}

template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode(const ElemType &d,BinTreeNode<ElemType> *lChild,BinTreeNode<ElemType> *rChild)   //含参构造
{
    data=d;
    leftChild=lChild;
    rightChild=rChild;
}


template <class ElemType>
class BinaryTree
{
protected:
    BinTreeNode<ElemType> *root;
    BinTreeNode<ElemType> *CopyTree(BinTreeNode<ElemType> *t);
    void Destroy(BinTreeNode<ElemType> *&r);
    BinTreeNode<ElemType>* buildWithPreIn(ElemType *pre,ElemType *in,int size);
   
public:
    ~BinaryTree();
    BinaryTree(ElemType *pre,ElemType *in,int size);
    void PreOrder(BinTreeNode<ElemType>* r);  //正序输出以r为根的树,不换行
    void InOrder(BinTreeNode<ElemType>* r);   //中序输出以r为根的树,不换行
    void PostOrder(BinTreeNode<ElemType>* r); //后序输出以r为根的树,不换行
    void showPre();
    void showIn();
    void showPost();
};

template<class ElemType>
BinTreeNode<ElemType>* BinaryTree<ElemType>::CopyTree(BinTreeNode<ElemType> *t)
{
    BinTreeNode<ElemType>* tcpy=new BinTreeNode<ElemType>(t->data);
    if(t->leftChild!=NULL)
    {
        BinTreeNode<ElemType>* left=CopyTree(t->leftChild);
        tcpy->leftChild=left;
    }
    if(t->rightChild!=NULL)
    {
        BinTreeNode<ElemType>* right=CopyTree(t->rightChild);
        tcpy->rightChild=right;
    }
    root=tcpy;
    return tcpy;
}

template<class ElemType>
void BinaryTree<ElemType>::Destroy(BinTreeNode<ElemType> *&r)
{
    if(r!=NULL)
    {
        Destroy(r->leftChild);
        Destroy(r->rightChild);
        delete r;
        r=NULL;
    }
}

template<class ElemType>
BinTreeNode<ElemType>* BinaryTree<ElemType>::buildWithPreIn(ElemType *pre,ElemType *in,int size)
{
    if(size==0)
    {
        return NULL;
    }
    int pos=0;
    BinTreeNode<ElemType>* r=new BinTreeNode<ElemType>(pre[0]);
    for(int i=0;i<size;i++)
    {
        if(in[i]==pre[0])
        {
            pos=i;
            break;
        }
    }
    r->leftChild=buildWithPreIn(pre+1, in, pos);
    r->rightChild=buildWithPreIn(pre+1+pos, in+1+pos, size-pos-1);
    return r;
}

template<class ElemType>
BinaryTree<ElemType>::~BinaryTree()
{
    Destroy(root);
}

template<class ElemType>
BinaryTree<ElemType>::BinaryTree(ElemType *pre,ElemType *in,int size)
{
    root=buildWithPreIn(pre, in, size);
}

template<class ElemType>
void BinaryTree<ElemType>::PreOrder(BinTreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    cout<<r->data<<" ";
    PreOrder(r->leftChild);
    PreOrder(r->rightChild);
    return;
}

template<class ElemType>
void BinaryTree<ElemType>::InOrder(BinTreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    InOrder(r->leftChild);
    cout<<r->data<<" ";
    InOrder(r->rightChild);
    return;
}

template<class ElemType>
void BinaryTree<ElemType>::PostOrder(BinTreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    PostOrder(r->leftChild);
    PostOrder(r->rightChild);
    cout<<r->data<<" ";
    return;
}

template<class ElemType>
void BinaryTree<ElemType>::showPre()
{
    PreOrder(root);
    cout<<endl;
}

template<class ElemType>
void BinaryTree<ElemType>::showIn()
{
    InOrder(root);
    cout<<endl;
}

template<class ElemType>
void BinaryTree<ElemType>::showPost()
{
    PostOrder(root);
    cout<<endl;
}

int main()
{
    char pre[]={'A','B','D','E','H','C','F','G'};
    char in[]={'D','B','E','H','A','F','C','G'};
    BinaryTree<char> tree(pre,in,8);
    tree.showPre();
}

一般树孩子兄弟表示法

#include<iostream>
#include<queue>
using namespace std;
template <class ElemType>
struct TreeNode
{
    ElemType data;
    TreeNode<ElemType> *firstChild;
    TreeNode<ElemType> *nextSibling;
    TreeNode();
    TreeNode(const ElemType &d,TreeNode<ElemType> *child=NULL,TreeNode<ElemType> *sibling=NULL);
    TreeNode(const TreeNode<ElemType>& cpy);
};

template<class ElemType>
TreeNode<ElemType>::TreeNode()    //无参构造
{
    firstChild=nextSibling=NULL;
}

template<class ElemType>
TreeNode<ElemType>::TreeNode(const ElemType &d,TreeNode<ElemType> *child,TreeNode<ElemType> *sibling)   //含参构造
{
    data=d;
    firstChild=child;
    nextSibling=sibling;
}


template <class ElemType>
class Tree
{
protected:
    TreeNode<ElemType> *root;
    void Destroy(TreeNode<ElemType> *&r);
    TreeNode<ElemType>* buildWithPreIn(ElemType *pre,ElemType *in,int size);
   
public:
    ~Tree();
    Tree(ElemType *pre,ElemType *in,int size);
    void PreOrder(TreeNode<ElemType>* r);  //正序输出以r为根的树,不换行
    void InOrder(TreeNode<ElemType>* r);   //中序输出以r为根的树,不换行
    void PostOrder(TreeNode<ElemType>* r); //后序输出以r为根的树,不换行
    void showPre();
    void showIn();
    void showPost();
    int getDepth(const ElemType & find,int ans=1,TreeNode<ElemType> *r=NULL) const ;
    int Depth() const;
    int Degree() const;
};

template<class ElemType>
void Tree<ElemType>::Destroy(TreeNode<ElemType> *&r)
{
    if(r!=NULL)
    {
        Destroy(r->firstChild);
        Destroy(r->nextSibling);
        delete r;
        r=NULL;
    }
}

template<class ElemType>
TreeNode<ElemType>* Tree<ElemType>::buildWithPreIn(ElemType *pre,ElemType *in,int size)
{
    if(size==0)
    {
        return NULL;
    }
    int pos=0;
    TreeNode<ElemType>* r=new TreeNode<ElemType>(pre[0]);
    for(int i=0;i<size;i++)
    {
        if(in[i]==pre[0])
        {
            pos=i;
            break;
        }
    }
    r->firstChild=buildWithPreIn(pre+1, in, pos);
    r->nextSibling=buildWithPreIn(pre+1+pos, in+1+pos, size-pos-1);
    return r;
}

template<class ElemType>
Tree<ElemType>::~Tree()
{
    Destroy(root);
}

template<class ElemType>
Tree<ElemType>::Tree(ElemType *pre,ElemType *in,int size)
{
    root=buildWithPreIn(pre, in, size);
}

template<class ElemType>
void Tree<ElemType>::PreOrder(TreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    cout<<r->data<<" ";
    PreOrder(r->firstChild);
    PreOrder(r->nextSibling);
    return;
}

template<class ElemType>
void Tree<ElemType>::InOrder(TreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    InOrder(r->firstChild);
    cout<<r->data<<" ";
    InOrder(r->nextSibling);
    return;
}

template<class ElemType>
void Tree<ElemType>::PostOrder(TreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    PostOrder(r->firstChild);
    PostOrder(r->nextSibling);
    cout<<r->data<<" ";
    return;
}

template<class ElemType>
void Tree<ElemType>::showPre()
{
    PreOrder(root);
    cout<<endl;
}

template<class ElemType>
void Tree<ElemType>::showIn()
{
    InOrder(root);
    cout<<endl;
}

template<class ElemType>
void Tree<ElemType>::showPost()
{
    PostOrder(root);
    cout<<endl;
}

template<class ElemType>
int Tree<ElemType>::getDepth(const ElemType & find,int ans,TreeNode<ElemType> *r) const
{
    if(r==NULL)
    {
        r=this->root;
    }
    if(r==NULL)
        return -1;
    if(r->data==find)
        return ans;
    TreeNode<ElemType> *p=r;
    if(p->firstChild!=NULL)
    {
        int dep=getDepth(find,ans+1,p->firstChild);
        if(dep!=-1)
        {
            return dep;
        }
    }
    TreeNode<ElemType> *s=p;
    while(s->data!=find)
    {
        if(s->firstChild!=NULL)
        {
            int dep=getDepth(find,ans+1,s->firstChild);
            if(dep!=-1)
                return dep;
        }
        if(s->nextSibling==NULL)
        {
            break;
        }
        else s=s->nextSibling;
    }
    if(s->data==find)
        return ans;
    return -1;
}

template<class ElemType>
int Tree<ElemType>::Depth() const
{
    int ans=1;
    TreeNode<ElemType> *p=root;
    while(p->firstChild!=NULL)
    {
        ans++;
        p=p->firstChild;
    }
    return ans;
}

template<class ElemType>
int Tree<ElemType>::Degree() const
{
    if(root==NULL||root->firstChild==NULL)
        return 0;
    queue<TreeNode<ElemType>*> q;
    int ans=0;
    q.push(root->firstChild);
    while(!q.empty())
    {
        TreeNode<ElemType> *p=q.front();
        int temp=0;
        while(p!=NULL)
        {
            if(p->firstChild!=NULL)
                q.push(p->firstChild);
            temp++;
            p=p->nextSibling;
        }
        ans=max(ans,temp);
        q.pop();
    }
    return ans;
}
int main()
{
    char pre[]={'I','A','B','D','E','H','C','F','G'};
    char in[]={'D','B','E','H','A','F','C','G','I'};
    Tree<char> tree(pre,in,9);
    cout<<tree.getDepth('F')<<endl;
    cout<<tree.Depth()<<endl;
    cout<<tree.Degree()<<endl;
}

BST二叉排序树

#include <iostream>
#include<algorithm>
using namespace std;
const int inf=999999999;
template <class ElemType>
struct BinTreeNode
{
    ElemType data;
    BinTreeNode<ElemType> *leftChild;
    BinTreeNode<ElemType> *rightChild;
    BinTreeNode();
    BinTreeNode(const ElemType &d,BinTreeNode<ElemType> *lChild=NULL,BinTreeNode<ElemType> *rChild=NULL);
    BinTreeNode(const BinTreeNode<ElemType>& cpy);
};

template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode()    //无参构造
{
    leftChild=rightChild=NULL;
}

template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode(const ElemType &d,BinTreeNode<ElemType> *lChild,BinTreeNode<ElemType> *rChild)   //含参构造
{
    data=d;
    leftChild=lChild;
    rightChild=rChild;
}


template <class ElemType>
class BinaryTree
{
protected:
    BinTreeNode<ElemType> *root;
    BinTreeNode<ElemType> *CopyTree(BinTreeNode<ElemType> *t);
    void Destroy(BinTreeNode<ElemType> *&r);
    BinTreeNode<ElemType>* buildWithPreIn(ElemType *pre,ElemType *in,int size);
   
public:
    ~BinaryTree();
    BinaryTree(ElemType *pre,ElemType *in,int size);
    void PreOrder(BinTreeNode<ElemType>* r);  //正序输出以r为根的树,不换行
    void InOrder(BinTreeNode<ElemType>* r);   //中序输出以r为根的树,不换行
    void PostOrder(BinTreeNode<ElemType>* r); //后序输出以r为根的树,不换行
    void showPre();
    void showIn();
    void showPost();
    bool isBST(const BinTreeNode<ElemType> *r,int minx,int maxx) const;
    void outputIsBST() const;
    //判断是否是BST
    void findLittle(const BinTreeNode<ElemType> *r,const ElemType & x) const;
    void outputLittle(const ElemType & x) ;
    //输出比x小的所有元素
};

template<class ElemType>
BinTreeNode<ElemType>* BinaryTree<ElemType>::CopyTree(BinTreeNode<ElemType> *t)
{
    BinTreeNode<ElemType>* tcpy=new BinTreeNode<ElemType>(t->data);
    if(t->leftChild!=NULL)
    {
        BinTreeNode<ElemType>* left=CopyTree(t->leftChild);
        tcpy->leftChild=left;
    }
    if(t->rightChild!=NULL)
    {
        BinTreeNode<ElemType>* right=CopyTree(t->rightChild);
        tcpy->rightChild=right;
    }
    root=tcpy;
    return tcpy;
}

template<class ElemType>
void BinaryTree<ElemType>::Destroy(BinTreeNode<ElemType> *&r)
{
    if(r!=NULL)
    {
        Destroy(r->leftChild);
        Destroy(r->rightChild);
        delete r;
        r=NULL;
    }
}

template<class ElemType>
BinTreeNode<ElemType>* BinaryTree<ElemType>::buildWithPreIn(ElemType *pre,ElemType *in,int size)
{
    if(size==0)
    {
        return NULL;
    }
    int pos=0;
    BinTreeNode<ElemType>* r=new BinTreeNode<ElemType>(pre[0]);
    for(int i=0;i<size;i++)
    {
        if(in[i]==pre[0])
        {
            pos=i;
            break;
        }
    }
    r->leftChild=buildWithPreIn(pre+1, in, pos);
    r->rightChild=buildWithPreIn(pre+1+pos, in+1+pos, size-pos-1);
    return r;
}

template<class ElemType>
BinaryTree<ElemType>::~BinaryTree()
{
    Destroy(root);
}

template<class ElemType>
BinaryTree<ElemType>::BinaryTree(ElemType *pre,ElemType *in,int size)
{
    root=buildWithPreIn(pre, in, size);
}

template<class ElemType>
void BinaryTree<ElemType>::PreOrder(BinTreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    cout<<r->data<<" ";
    PreOrder(r->leftChild);
    PreOrder(r->rightChild);
    return;
}

template<class ElemType>
void BinaryTree<ElemType>::InOrder(BinTreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    InOrder(r->leftChild);
    cout<<r->data<<" ";
    InOrder(r->rightChild);
    return;
}

template<class ElemType>
void BinaryTree<ElemType>::PostOrder(BinTreeNode<ElemType>* r)
{
    if(r==NULL)
    {
        return;
    }
    PostOrder(r->leftChild);
    PostOrder(r->rightChild);
    cout<<r->data<<" ";
    return;
}

template<class ElemType>
void BinaryTree<ElemType>::showPre()
{
    PreOrder(root);
    cout<<endl;
}

template<class ElemType>
void BinaryTree<ElemType>::showIn()
{
    InOrder(root);
    cout<<endl;
}

template<class ElemType>
void BinaryTree<ElemType>::showPost()
{
    PostOrder(root);
    cout<<endl;
}

template<class ElemType>
bool BinaryTree<ElemType>::isBST(const BinTreeNode<ElemType> *r,int  minx,int  maxx) const
{
    if(r==NULL)
        return 1;
    if(r->data < minx ||r->data >maxx)
        return 0;
    return isBST(r->leftChild, minx, r->data-1) && isBST(r->rightChild, r->data-1, maxx);
}

template<class ElemType>
void BinaryTree<ElemType>::outputIsBST() const
{
    cout<<isBST(root, -inf, inf)<<endl;
}

template<class ElemType>
void BinaryTree<ElemType>::findLittle(const BinTreeNode<ElemType> *r,const ElemType & x) const
{
    if(r==NULL)
        return;
    if(r->data>x)
    {
        findLittle(r->leftChild, x);
    }
    if(r->data==x)
    {
        cout<<r->data<<" ";
        findLittle(r->leftChild, x);
    }
    if(r->data<x)
    {
        findLittle(r->rightChild, x);
        cout<<r->data<<" ";
        findLittle(r->leftChild, x);
    }
}

template<class ElemType> 
void BinaryTree<ElemType>::outputLittle(const ElemType & x) 
{
    findLittle(root, x);
}
int main()
{
    int pre[]={5,2,1,4,3,6,9,8};
    int in[]={1,2,3,4,5,6,8,9};
    BinaryTree<int> tree(pre,in,8);
    tree.outputIsBST();
    tree.outputLittle(6);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值