实验三二叉树的物理实现

#include<iostream>
#include<queue>
using namespace std;
template<typename E>
class BinNode
{
private:
    BinNode*lc;
    BinNode*rc;
    E elem;
public:

    BinNode()
    {
        lc = NULL;
        rc = NULL;
    }
    BinNode(E tmp, BinNode*l=NULL, BinNode*r=NULL)
    {
        elem = tmp;
        lc = l;
        rc = r;
    }
    BinNode*left()
    {
        return lc;
    }
    BinNode*right()
    {
        return rc;
    }
    void setLeft(BinNode*l)
    {
        lc = l;
    }
    void setRight(BinNode*r)
    {
        rc = r;
    }
    void setValue(E tmp)
    {
        elem = tmp;
    }
    E getValue()
    {
        return elem;
    }
    bool isLeaf()
    {
        if (lc == NULL&&rc == NULL)
            return true;
        else
            return false;
    }
};
#include <stdio.h>
#include"BinNode.h"
#include"string"
#include<queue>
template<typename E>
class BinTree
{
private:
    E *in;
    E *post;
    int size;
    BinNode<E>*root;
public:
    BinTree(int n)
    {
        root=NULL;
        size=n;
        in=new E[size];
        post=new E[size];
        for(int i=0;i<n;i++)cin>>post[i];
        for(int i=0;i<n;i++)cin>>in[i];
    }
    BinTree()  {root=new BinNode<E>;}
    ~BinTree(){clear(root);}
    bool BinTreeEmpty()
    {
        if (root == NULL)
            return true;
        else
            return false;
    }
    BinNode<E>*getRoot()
    {
        return root;
    }
    void setRoot(BinNode<E>*r)
    {
        root = r;
    }
    void clear(BinNode<E>*r)
    {

        if (r == NULL)
            return;
        if (r->left())
        {
            clear(r->left());
        }
        if (r->right())
        {
            clear(r->right());
        }
        delete r;
        r = NULL;
    }
    void clear()
    {
        clear(root);
        root = NULL;
    }
    void preorder(BinNode<E>* rt)
    {
        if(rt!=NULL)
        {
            cout<<rt->element()<<" ";
            preorder(rt->left());
            preorder(rt->right());
        }
    }
 void Inorder(BinNode<E>* rt)
    {
        if(rt)
        {
            Inorder(rt->left());
            cout<<rt->element()<<" ";
            Inorder(rt->right());
        }
    }
    void postorder(BinNode<E>* rt)
    {
        if(rt)
        {
            postorder(rt->left());
            postorder(rt->right());
            cout<<rt->element()<<" ";
        }
    }
    void LevelOrderTraverse(BinNode<E>*root)
    {
        queue<BinNode<E>*> q;
        if(root)
            q.push(root);
        BinNode<E>* b;
        while(!q.empty())
        {
            b=q.front();
            cout<<b->getValue()<<' ';
            q.pop();
            if(b->left())
                q.push(b->left());
            if(b->right())
                q.push(b->right());
        }
    }
    int BinTreeDepth(BinNode<E>*tmp)
    {
        if (tmp == NULL)
            return 0;
        int ld = 0;
        int rd = 0;
        if (tmp->left() != NULL)
            ld = BinTreeDepth(tmp->left());
        if (tmp->right() != NULL)
            rd = BinTreeDepth(tmp->right());
        if (ld >= rd)
            return ld + 1;
        else
            return rd + 1;
    }
    int BinTreeNodes(BinNode<E>*tmp)
    {
        if (tmp == NULL)
            return 0;
        queue<BinNode<E>*>que;
        que.push(tmp);
        BinNode<E>* curr;
        int sum = 0;
        while (que.empty() != true)
        {
            curr = que.front();
            if (curr->left() != NULL)
            {
                que.push(curr->left());
            }
            if (curr->right() != NULL)
            {
                que.push(curr->right());
            }
            que.pop();
            sum++;
        }
        return sum;
    }
    int BinTreeHeight(BinNode<E>*tmp)
    {
        if (tmp == NULL)
            return 0;
        return BinTreeDepth(tmp) - 1;
    }
    int BinTreeLeafs(BinNode<E>*tmp)
    {
        if (tmp == NULL)
            return 0;
        queue<BinNode<E>*>que;
        que.push(tmp);
        BinNode<E>* curr;
        int sum = 0;
        while (que.empty() != true)
        {
            curr = que.front();
            if (curr->left() != NULL)
            {
                que.push(curr->left());
            }
            if (curr->right() != NULL)
            {
                que.push(curr->right());
            }
            if (curr->right() == NULL&&curr->left() == NULL)
                sum++;
            que.pop();
        }
        return sum;
    }
    bool find(BinNode<E>*tmp, E e)
    {
        if (tmp == NULL)
            return false;
        queue<BinNode<E>*>que;
        que.push(tmp);
        BinNode<E>* curr;
        while (que.empty() != true)
        {
            curr = que.front();
            if (curr->left() != NULL)
            {
                que.push(curr->left());
            }
            if (curr->right() != NULL)
            {
                que.push(curr->right());
            }
            if (curr->getValue() == e)
                return true;
            que.pop();
        }
        return false;
    }
    BinNode<E>*create(int postL,int postR,int inL,int inR)
    {
        if(postL>postR)return NULL;
        BinNode<E>*r = new BinNode<E>;
        r->setValue(post[postR]);
        int k;
        for(k = inL; k <= inR; k++)
        {
            if(in[k] == post[postR]) break;
        }
        int numLeft = k - inL;
        r->setLeft ( create(postL, postL + numLeft - 1, inL, k - 1));
        r->setRight( create(postL + numLeft, postR - 1, k + 1, inR));
        return r;
    }
};
#include"BinTree.h"
#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    BinTree<int>bt(n);
    BinNode<int>*r =bt.create(0,n-1,0,n-1);
    bt.LevelOrderTraverse(r);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值