日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

二叉树的实现

發(fā)布時(shí)間:2024/4/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include<iostream> using?namespace?std; #include<queue> #include<stack> template<class?T> struct?BinaryTreeNode//節(jié)點(diǎn) { ????BinaryTreeNode(const?T&?x)//構(gòu)造函數(shù) ????????:_data(x) ????????,_left(NULL) ????????,_right(NULL) ????{} ????T?_data; ????BinaryTreeNode<T>*?_left; ????BinaryTreeNode<T>*?_right; }; template<class?T> class?BinaryTree { public: ????BinaryTree()//構(gòu)造函數(shù) ????????:_root(NULL)//根節(jié)點(diǎn)賦空值 ????{} ????? ????BinaryTree(const?T*?a,size_t?size)//建立二叉樹 ????{ ????????size_t?index=0; ????????_root=_CreatTree(a,index,size); ????} ????~BinaryTree()//析構(gòu) ????{ ????????Destroy(); ????} ????BinaryTreeNode<T>*?Copy() ????{ ????????return?_Copy(_root); ????} ????BinaryTreeNode<T>*?Destroy()//刪除二叉樹 ????{ ???????return?_Deatroy(_root); ????} ????void?PrevOrder()//前序遍歷 ????{ ???????_PrevOrder(_root); ???????cout<<endl; ????} ????void?InOrder()//中序遍歷 ????{ ???????_InOrder(_root); ???????cout<<endl; ????} ????void?PostOrder()//后序遍歷 ????{ ???????_PostOrder(_root); ???????cout<<endl; ????}?? ????void?LevelOrder()//層次遍歷 ????{ ????????_LevelOrder(_root); ????????cout<<endl; ????} ????int?Size()//計(jì)算大小 ????{ ?????????return?_Size(_root); ?????????cout<<endl; ????} ????int?LeafNum()//葉子節(jié)點(diǎn)個(gè)數(shù) ????{ ?????????return?_LeafNum(_root); ?????????cout<<endl; ????} ????int?Hight()//計(jì)算二叉樹高度 ????{ ????????return?_Hight(_root); ????} ????void?PrevOrder_Non_R()//非遞歸前序遍歷 ????{ ?????????_PrevOrder_Non_R(_root); ?????????cout<<endl; ????} ????void?InOrder_Non_R()//非遞歸中序遍歷 ????{ ??????????_InOrder_Non_R(_root); ??????????cout<<endl; ????} ????void?PostOrder_Non_R()//非遞歸后序遍歷 ????{ ??????????_PostOrder_Non_R(_root); ??????????cout<<endl; ????} protected: ????BinaryTreeNode<T>*?_CreatTree(const?T*?a,size_t&?index,size_t?size)//創(chuàng)建二叉樹 ????{ ?????????BinaryTreeNode<T>*?root=NULL; ?????????if(index<size&&a[index]!='#') ?????????{ ?????????????root=new?BinaryTreeNode<T>(a[index]);//先序創(chuàng)建根節(jié)點(diǎn) ?????????????root->_left=_CreatTree(a,++index,size);//遞歸創(chuàng)建左節(jié)點(diǎn) ?????????????root->_right=_CreatTree(a,++index,size);//遞歸創(chuàng)建右節(jié)點(diǎn) ?????????} ?????????return?root; ????} ????void?_PrevOrder(BinaryTreeNode<T>*?root) ????{ ????????if(root==NULL) ????????{ ????????????return; ????????} ????????else ????????{ ????????????cout<<root->_data<<"?"; ???????????_PrevOrder(root->_left?); ???????????_PrevOrder(root->_right?); ????????} ????} ????void?_InOrder(BinaryTreeNode<T>*?root) ????{ ???????if(root==NULL) ???????{ ??????????return; ???????} ??????else ???????{ ??????????_InOrder(root->_left?); ??????????cout<<root->_data?<<"?"; ??????????_InOrder(root->_right?); ???????} ????} ????void?_PostOrder(BinaryTreeNode<T>*?root) ????{ ????????if(root==NULL) ????????????return; ????????else ????????{ ????????????_PostOrder(root->_left?); ????????????_PostOrder(root->_right?); ????????????cout<<root->_data?<<"?"; ????????} ????} ????void?_LevelOrder(BinaryTreeNode<T>*?root)//隊(duì)列的使用 ????{ ???????queue<BinaryTreeNode<T>*>?q; ???????q.push(root); ???????while(root) ???????{ ???????????cout<<root->_data?<<"?"; ???????????if(!q.empty()) ???????????{ ??????????????BinaryTreeNode<T>*?front?=q.front(); ??????????????q.pop(); ??????????????q.push(front->_left?); ??????????????q.push(front->_right?); ???????????} ???????????root=q.front(); ???????} ????} ????int?_Size(BinaryTreeNode<T>*?root) ????{ ????????if(root==NULL) ????????????return?0; ????????return??_Size(root->_left?)+_Size(root->_right?)+1; ????} ????int?_LeafNum(BinaryTreeNode<T>*?root) ????{ ????????if(root==NULL) ????????????return?0; ????????if((root->_left?==NULL)&&(root->_right?==NULL)) ????????????return?1; ????????? ????????return?_LeafNum(root->_left?)+_LeafNum(root->_right?); ????} ????int?_Hight(BinaryTreeNode<T>*?root) ????{ ????????if(root==NULL) ????????????return?0; ????????if(_Hight(root->_left)?>_Hight(root->_right?)) ????????{ ????????????return??_Hight(root->_left?)+1; ????????} ????????else ????????{ ?????????????return?_Hight(root->_right?)+1; ????????} ????} ????BinaryTreeNode<T>*?_Copy(BinaryTreeNode<T>*?root) ????{ ????????if(root==NULL) ????????????return?NULL; ????????else ????????{ ????????????BinaryTreeNode<T>*?r=new?BinaryTreeNode<T>(root->_data?); ????????????BinaryTreeNode<T>*?left=_Copy(root->_left?); ????????????BinaryTreeNode<T>*?right=_Copy(root->_right?); ????????????return?r; ????????} ????} ????BinaryTreeNode<T>*?_Deatroy(BinaryTreeNode<T>*&?root) ????{ ???????if(root!=NULL) ???????{ ???????????_Destroy(root->_left?); ???????????_Deatroy(root->_right?); ???????????delete?root; ???????????root=NULL; ???????} ???????return?root; ????} ????void??_PrevOrder_Non_R(BinaryTreeNode<T>*?root) ????{ ????????BinaryTreeNode<T>*?cur=root; ????????stack<BinaryTreeNode<T>*>?s; ????????while(cur!=NULL||!s.empty?()) ????????{ ????????????while(cur!=NULL) ????????????{ ?????????????????cout<<cur->_data?<<"?"; ?????????????????s.push(cur); ?????????????????cur=cur->_left?; ????????????} ????????????if(!s.empty?()) ????????????{ ?????????????????cur=s.top(); ?????????????????s.pop(); ?????????????????cur=cur->_right?; ????????????} ????????}?????? ????} ????void??_InOrder_Non_R(BinaryTreeNode<T>*?root) ????{ ????????BinaryTreeNode<T>*?cur=root; ????????stack<BinaryTreeNode<T>*>?s; ????????while(cur!=NULL||!s.empty?()) ????????{ ????????????while(cur!=NULL) ????????????{ ?????????????????s.push(cur); ?????????????????cur=cur->_left?; ????????????} ????????????if(!s.empty?()) ????????????{ ?????????????????cur=s.top(); ?????????????????cout<<cur->_data?<<"?"; ?????????????????s.pop(); ?????????????????cur=cur->_right?; ????????????} ????????}?????? ????} ????void?_PostOrder_Non_R(BinaryTreeNode<T>*?root) ????{ ????????BinaryTreeNode<T>*?cur=NULL; ????????BinaryTreeNode<T>*?temp=NULL; ????????stack<BinaryTreeNode<T>*>?s; ????????s.push(root); ????????while(!s.empty?()) ????????{ ????????????cur=s.top(); ????????????if((cur->_left?==NULL?&&?cur->_right?==NULL)|| ????????????????(temp!=NULL?&&?(temp==cur->_left||temp==cur->_right))) ????????????{ ???????????????cout<<cur->_data?<<"?"; ???????????????s.pop(); ???????????????temp=cur; ????????????} ????????????else ????????????{ ????????????????if(cur->_right?!=NULL) ????????????????{ ???????????????????s.push(cur->_right?); ????????????????} ????????????????if(cur->_left?!=NULL) ????????????????{ ????????????????????s.push(cur->_left?); ????????????????} ????????????} ????????}?????? ????} protected: ????BinaryTreeNode<T>*?_root; };

總結(jié)

以上是生活随笔為你收集整理的二叉树的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。