二叉樹
創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)專家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,專業(yè)領(lǐng)域包括成都網(wǎng)站設(shè)計、做網(wǎng)站、電商網(wǎng)站制作開發(fā)、微信平臺小程序開發(fā)、微信營銷、系統(tǒng)平臺開發(fā),與其他網(wǎng)站設(shè)計及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!構(gòu)建:二叉樹的構(gòu)建采用的是先序遍歷,->先儲存根節(jié)點(diǎn)然后左右節(jié)點(diǎn),用遞歸的思想將所有數(shù)據(jù)放在樹中。
代碼實(shí)現(xiàn):實(shí)現(xiàn)了4種訪問方法,先序,中序,后序,和層序的訪問方法都采用遞歸的方式。
#include#include #include using namespace std; template struct rootnode { T _value; rootnode *_leftnode; rootnode *_rightnode; rootnode (T value) : _value(value), _leftnode(NULL), _rightnode(NULL) {} }; template class BinaryTree { public: BinaryTree ( T *str) { T *tmp = str; _root = _BinaryTree(tmp); } ~BinaryTree() { _Clear(_root); } BinaryTree (BinaryTree &t) { _root=_Copy(t._root); } BinaryTree & operator=(BinaryTree t) { if (*this != t) { swap(_root, t._root); } } void Fastorder() { _Fastorder(_root); } void Inorder() { _Inorder(_root); } void Postorder() { _Postorder(_root); } void Levelorder() { queue *> q; if (_root == NULL) { return; } q.push(_root); while (!q.empty()) { rootnode * root = q.front(); cout << root->_value; q.pop(); if (root->_leftnode != NULL) { q.push(root->_leftnode); } if (root->_rightnode != NULL) { q.push(root->_rightnode); } } } int leafnum() { int num = 0; num=_Leafnum(_root,num); return num; } int Size() { int size = 0; _Size(_root,size); return size; } int Depth() { int Depth = _Depth(_root); return Depth; } void NRfastorder() { stack *> s; if (_root != NULL) { s.push(_root); } while (!s.empty()) { rootnode * front=s.top(); cout< _value; s.pop(); if (front->_rightnode != NULL) { s.push(front->_rightnode); } if (front->_leftnode != NULL) { s.push(front->_leftnode); } } } void NRinorder() { stack *>s; rootnode *cur = _root; rootnode * top = NULL; while (cur||!s.empty()) { while (cur) { s.push(cur); cur = cur->_leftnode; } if (top != s.top()->_rightnode) { top = s.top(); cout << top->_value; s.pop(); cur = top->_rightnode; } else { top = s.top(); cout << top->_value; s.pop(); } } } void NRpostorder() { rootnode *cur = _root; stack *> s; rootnode *top = NULL; while (cur || !s.empty()) { while (cur) { s.push(cur); cur = cur->_leftnode; } if (s.top()->_rightnode != NULL&&top != s.top()->_rightnode) { top = s.top(); cur = top->_rightnode; } else { top = s.top(); s.pop(); cout << top->_value; } } } protected: rootnode * _BinaryTree(T *&str) { rootnode *root = NULL; if (*str != '#'&&*str != '\0') { root = new rootnode (*str); str++; root->_leftnode = _BinaryTree(str); str++; root->_rightnode = _BinaryTree(str); } return root; } void _Fastorder(rootnode *&root) { if (root == NULL) { return; } else { cout << root->_value; _Fastorder(root->_leftnode); _Fastorder(root->_rightnode); } } void _Inorder(rootnode *root) { if (root == NULL) { return; } _Inorder(root->_leftnode); cout << root->_value; _Inorder(root->_rightnode); } void _Postorder(rootnode *root) { if (root == NULL) { return; } _Postorder(root->_leftnode); _Postorder(root->_rightnode); cout << root->_value; } void _Clear(rootnode *root) { if (root == NULL) { return; } rootnode *tmp = root->_leftnode; rootnode *tmp2 = root->_rightnode; delete root; _Clear(tmp); _Clear(tmp2); } rootnode * _Copy(rootnode *root) { rootnode *newroot = NULL; if (root == NULL) { return newroot; } newroot = new rootnode (root->_value); newroot->_leftnode = _Copy(root->_leftnode); newroot->_rightnode = _Copy(root->_rightnode); return newroot; } int _Size(rootnode *root,int &size) { if (root == NULL) { return 0; } size++; _Size(root->_leftnode,size); _Size(root->_rightnode,size); return size; } int _Depth(rootnode *root) { if (root==NULL) { return 0; } int hight = 1; int left = 0; int right = 0; left += _Depth(root->_leftnode) + hight; right += _Depth(root->_rightnode) + hight; if (left > right) { return left; } else { return right; } } int _Leafnum(rootnode * root,int &num) { if (root == NULL) { return 0; } if (root->_leftnode == NULL&&root->_rightnode == NULL) { num++; } _Leafnum(root->_leftnode, num); _Leafnum(root->_rightnode, num); return num; } private: rootnode *_root; }; void Test1() { char *str = "123##45##6##78###"; BinaryTree b1(str); BinaryTree b2(b1); BinaryTree b3 = b2; b1.Fastorder(); cout << endl; b1.Inorder(); cout << endl; b1.Postorder(); cout << endl; b2.Fastorder(); cout << endl; b3.Fastorder(); cout << endl; cout << b3.Size()< 創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
網(wǎng)頁標(biāo)題:數(shù)據(jù)結(jié)構(gòu)--二叉樹(1)-創(chuàng)新互聯(lián)
文章位置:http://weahome.cn/article/iihce.html