模板二叉树的创建与深度遍历(栈、递归)和广度优先遍历(队列)

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
template<class T>
class TreeNode//节点类
{
public:
    T val;
    TreeNode<T>* lc;
    TreeNode<T>* rc;
public:
    TreeNode(T _val=0,TreeNode<T> *_lc=NULL,TreeNode<T>* _rc=NULL):val(_val),     lc(_lc),rc(_rc)
    {

    }
    ~TreeNode()
    {}
    TreeNode<T>*Getlc()const{
        return lc;
    }
    // void CreateNode(TreeNode)
    void Setlc(TreeNode<T>* _lc);
    TreeNode<T>* Getrc() const;
    void Setrc(TreeNode<T>* _rc);
    void SetVal(T _val);
    T GetVal() const
    {
        return val;
    }
    bool IsLeaf();
};
template<class T>
void TreeNode<T>::SetVal(T _val)
{
    val=_val;
}
template<class T>
void TreeNode<T>::Setlc(TreeNode<T>* _lc)
{
    lc=_lc;
}
template<class T>
void TreeNode<T>::Setrc(TreeNode<T>* _rc)
{
    rc=_rc;
}
template<class T>
TreeNode<T>* TreeNode<T>::Getrc() const
{
    return rc;
}
template<class T>
struct NodeBtr
{
    T val;
    NodeBtr<T> * lc;
    NodeBtr<T>* rc;
};
template<class T>
class Tree
{
private:
    TreeNode<T>* subroot;
public:
    Tree(TreeNode<T> *_subroot):subroot(_subroot)
    {}
    Tree()
    {
        subroot=new TreeNode<T>();
    }
    ~Tree()
    {}
    TreeNode<T>* CreateTreeNode();
    void CreatTree();
    bool IsEmptyTree()const;
    void DepthTraveral_Recursion() const;
    void DepthTraveral_RecursionbyNode(TreeNode<T> *Node) const;
    void SetRoot(TreeNode<T>*a)
    {
        subroot=a;
    }
          void DepthTraveral_Non_Recursion() const;//深层遍历非递归
          void BreadthTraversal_Recursion() const;//广度优先遍历递归
          void BreadthTraversal_Non_Recursion() const;//广度优先遍历非递归
};
template <class T>
void Tree<T>::BreadthTraversal_Recursion() const
{
    if(NULL==subroot)
    {
        return ;
    }
    queue<TreeNode<T>*> Travel;
    Travel.push(subroot);
    while(!Travel.empty())
    {
        TreeNode<T>* Travel_top=Travel.front();
        cout<<Travel_top->val<<" ";
        Travel.pop();
        if(NULL!=Travel_top->lc)
        {
            Travel.push(Travel_top->lc);
        }
        if(NULL!=Travel_top->rc)
        {
            Travel.push(Travel_top->rc);
        }
    }
}
template<class T>
void Tree<T>::BreadthTraversal_Non_Recursion() const
{

}
template <class T>
void Tree<T>::DepthTraveral_Non_Recursion() const
{
    if(subroot==NULL)
    {
        return;
    }
    stack<TreeNode<T>*> Travel;
    Travel.push(subroot);
    while(!Travel.empty())
    {
        TreeNode<T>*Travel_top=Travel.top();//返回的是栈顶的元素
        cout<<Travel_top->val<<" ";
        Travel.pop();
        if(NULL!=Travel_top->rc)
        {
            Travel.push(Travel_top->rc);
        }
        if(NULL!=Travel_top->lc)
        {
            Travel.push(Travel_top->lc);
        }
    }

}
template<class T>
TreeNode<T>* Tree<T>::CreateTreeNode()
{
    T n;
    cout<<"输入当前节点的值:";
    cin>>n;
    if(n<0)
    {
        return NULL;
    }
    TreeNode<T> *p=new TreeNode<T>(n);
    p->lc=CreateTreeNode();
    p->rc=CreateTreeNode();
    return p;
}
template<class T>
void Tree<T>::CreatTree()
{

    CreateTreeNode();
}
template<class T>
void Tree<T>::DepthTraveral_Recursion() const
{
    DepthTraveral_RecursionbyNode(subroot);
}
template<class T>
void Tree<T>::DepthTraveral_RecursionbyNode(TreeNode<T> *Node) const
{
    if(NULL==Node)
    {
        //cout<<"当前树为空"<<endl;
        return ;
    }
    cout<<Node->GetVal()<<" ";
    DepthTraveral_RecursionbyNode(Node->lc);
    DepthTraveral_RecursionbyNode(Node->rc);
}
int main(int argc,char **argv)
{
    Tree<int>* root=new Tree<int>();
    root->SetRoot(root->CreateTreeNode());
    root->DepthTraveral_Recursion();

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值