您的位置:首页 > 其它

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

2018-04-02 07:57 495 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树
相关文章推荐