国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

二叉樹 前序遍歷的非遞歸實現 中序遍歷的非遞歸實現 后序遍歷的非遞歸實現  創建二叉樹

2019-11-08 19:58:06
字體:
來源:轉載
供稿:網友
#ifndef _TREE_H#define _TREE_Htemplate<class Type>class BinTree;template<class Type>class BinTreeNode{friend BinTree<Type>;BinTreeNode(Type d=Type(),BinTreeNode<Type>* l=NULL,BinTreeNode<Type>*r=NULL):data(d),leftChild(l),rightChild(r){}~BinTreeNode(){}PRivate:Type data;BinTreeNode<Type> *leftChild;BinTreeNode<Type>* rightChild;};template<class Type>class BinTree{public:BinTree(Type ref){    root=NULL;    refval=ref;}void CreateTree(){    CreateTree(root);}void CreateTree(BinTreeNode<Type> *&t){    Type Item;    cin>>Item;    if(Item==refval)    t=NULL;    else    {    t=new BinTreeNode<Type>(Item);    CreateTree(t->leftChild);    CreateTree(t->rightChild);    }}void CreateTree(const Type *&str){    CreateTree(root,str);}void CreateTree(BinTreeNode<Type> *&t,const Type* &str)//注意此處str傳遞引用{    if(*str==refval)    t=NULL;    else    {    t=new BinTreeNode<Type>(*str);    CreateTree(t->leftChild,++str);    CreateTree(t->rightChild,++str);    }}~BinTree(){    destroyTree();}void destroyTree(){    destroyTree(root);}void destroyTree(BinTreeNode<Type> *&t){    if(t!=NULL)    {        destroyTree(t->leftChild);        destroyTree(t->rightChild);        delete t;        t=NULL;    }}//////////////////////////////////////void PreOrder()const;void PreOrder(BinTreeNode<Type>* t)const;void PreOrder_1()const;void PreOrder_1(BinTreeNode<Type> *t)const;void InOrder()const;void InOrder_1()const;void InOrder(BinTreeNode<Type> *t)const;void InOrder_1(BinTreeNode<Type> *t)const;void PostOrder()const;void PostOrder(BinTreeNode<Type> *t)const;void PostOrder_1()const;void PostOrder_1(BinTreeNode<Type> *t)const;void leverOrder()const;void leverOrder(BinTreeNode<Type>* t)const;private:BinTreeNode<Type> *root;Type refval;};template<class Type>void BinTree<Type>::PreOrder()const{    PreOrder(root);}template<class Type>void BinTree<Type>::PreOrder(BinTreeNode<Type> *t)const//前序遍歷的遞歸版本實現{    if(t!=NULL)    {        cout<<t->data<<"  ";        PreOrder(t->leftChild);        PreOrder(t->rightChild);    }}template<class Type>void BinTree<Type>::PreOrder_1()const{    PreOrder_1(root);}template<class Type>void BinTree<Type>::PreOrder_1(BinTreeNode<Type> *t)const//前序遍歷的非遞歸版本實現{    stack<BinTreeNode<Type>*  >st;    if(t!=NULL)    {        st.push(t);        while(!st.empty())        {            t=st.top();            st.pop();            cout<<t->data<<"  ";            if(t->rightChild!=NULL)            st.push(t->rightChild);            if(t->leftChild!=NULL)            st.push(t->leftChild);        }    }}template<class Type>void BinTree<Type>::InOrder()const{    InOrder(root);}template<class Type>void BinTree<Type>::InOrder(BinTreeNode<Type> *t)const//中序遍歷的遞歸版本的實現{    if(t!=NULL)    {        InOrder(t->leftChild);        cout<<t->data<<"  ";        InOrder(t->rightChild);    }}template<class Type>void BinTree<Type>::InOrder_1()const{    InOrder_1(root);}template<class Type>void BinTree<Type>::InOrder_1(BinTreeNode<Type> *t)const//中續遍歷的非遞歸版本{    stack<BinTreeNode<Type>*  >st;    do    {    while(t!=NULL)    {        st.push(t);        t=t->leftChild;    }    if(!st.empty())    {        t=st.top();        cout<<t->data<<"  ";        st.pop();        t=t->rightChild;    }    }while(!st.empty()||t!=NULL);}template<class Type>void BinTree<Type>::PostOrder()const{PostOrder(root);}template<class Type>void BinTree<Type>::PostOrder(BinTreeNode<Type> *t)const//后序遍歷遞歸版本{if(t!=NULL){    PostOrder(t->leftChild);    PostOrder(t->rightChild);    cout<<t->data<<"  ";}}template<class Type>void BinTree<Type>::PostOrder_1()const{PostOrder_1(root);}typedef enum{L,R}Tag;template<class Type>struct STNode{    BinTreeNode<Type>* node;    Tag                tag;};template<class Type>void BinTree<Type>::PostOrder_1(BinTreeNode<Type> *t)const//后序遍歷的非遞歸版本實現{stack<STNode<Type> >st;STNode<Type>  tm;    do    {        while(t!=NULL)        {            tm.tag=L;            tm.node=t;            st.push(tm);            t=t->leftChild;        }        if(!st.empty())        {            tm=st.top();            if(tm.tag==L)            {                st.pop();                tm.tag=R;                st.push(tm);                t=tm.node->rightChild;            }            else            {                    while(tm.tag==R&&!st.empty())                {                        st.pop();                    cout<<tm.node->data<<"  ";                    if(!st.empty())                    {                    tm=st.top();                    t=tm.node->rightChild;                    }                }                if(!st.empty())                {                tm=st.top();                tm.tag=R;                st.pop();                st.push(tm);                }            }        }    }while(!st.empty());

}

template<class Type>void BinTree<Type>::leverOrder()const{    leverOrder(root);}template<class Type>void BinTree<Type>::leverOrder(BinTreeNode<Type>* t)const//層次遍歷{    queue<BinTreeNode<Type>*  > Q;    if(t!=NULL)    {        Q.push(t);    }    while(!Q.empty())    {        t=Q.front();        cout<<t->data<<"  ";        Q.pop();        if(t->leftChild!=NULL)        Q.push(t->leftChild);        if(t->rightChild!=NULL)        Q.push(t->rightChild);    }    }

template<class Type>int BinTree<Type>::size(){    size(root);}template<class Type>int BinTree<Type>::size(BinTreeNode<Type>* t){    if(t==NULL)    return 0;    else    {        return size(t->leftChild)+size(t->rightChild)+1;    }}template<class Type>int BinTree<Type>::height(){    height(root);}template<class Type>int BinTree<Type>::height(BinTreeNode<Type>* t){    if(t==NULL)    return 0;    else    {        int left_H=height(t->leftChild);        int right_H=height(t->rightChild);        return (left_H>right_H?left_H:right_H)+1;    }}template<class Type>BinTreeNode<Type>* BinTree<Type>::Find(Type key){    Find(root,key);}template<class Type>BinTreeNode<Type>* BinTree<Type>::Find(BinTreeNode<Type>* t,Type key){BinTreeNode<Type>*p;    if(t!=NULL)    {        if(t->data==key)        return t;        else         p=Find(t->leftChild,key);        if(p==NULL)        return Find(t->rightChild,key);    }    else    return NULL;}template<class Type>BinTreeNode<Type>* BinTree<Type>::Parent(Type key){    Parent(root,key);}template<class Type>BinTreeNode<Type>* BinTree<Type>::Parent(BinTreeNode<Type> *t,Type key){    if(t==NULL)    return t;        BinTreeNode<Type>*p=Find(key);        if(p==NULL||p==t)        return NULL;        if(t->leftChild==p||t->rightChild==p)        return t;        p=Parent(t->leftChild,key);        if(p!=NULL)        return p;        else        return Parent(t->rightChild,key);}#endif

#endif

#endif
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乡族自治县| 宁乡县| 通榆县| 洛宁县| 叙永县| 攀枝花市| 苏州市| 桑日县| 长泰县| 白朗县| 漳浦县| 通州市| 平阴县| 楚雄市| 田林县| 甘洛县| 犍为县| 江永县| 永嘉县| 五家渠市| 团风县| 宝应县| 马公市| 峡江县| 那坡县| 嘉义县| 邳州市| 巨野县| 广南县| 石泉县| 化德县| 漾濞| 南宁市| 德庆县| 延庆县| 志丹县| 辰溪县| 温宿县| 绥芬河市| 那坡县| 岳普湖县|