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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【数据结构】普通二叉树的实现

發(fā)布時間:2023/11/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构】普通二叉树的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、問題概述

?????? 樹是n個有限個數(shù)據(jù)的集合,形如:


?????? 它像不像倒著的樹呢?我們把它看成是一種數(shù)據(jù)結(jié)構(gòu)----樹。它的第一個節(jié)點稱作樹的根,最底下的那些節(jié)點稱作樹的葉子。

?????? 我們今天所要研究的是二叉樹,即父節(jié)點最多只有兩個孩子(左孩子和右孩子)。



二叉樹還有兩種特殊的結(jié)構(gòu),分為完全二叉樹和滿二叉樹。

如:


滿二叉樹:高度為N的滿二叉樹有2^N-1個節(jié)點。

完全二叉樹:高度為N,前N-1層為滿二叉樹,第N層為連續(xù)的葉子節(jié)點。

二叉樹有四種遍歷方式:

前序遍歷(根左右),中序遍歷(左根右),后序遍歷(左右根),層序遍歷(從上往下,從左往右)。

那么,如何實現(xiàn)一個二叉樹的數(shù)據(jù)結(jié)構(gòu)呢?

二、數(shù)據(jù)結(jié)構(gòu)的設(shè)計

???????在這里,我們采取鏈表的方式,即創(chuàng)建節(jié)點,將節(jié)點與節(jié)點鏈接起來的方式實現(xiàn)二叉樹。

節(jié)點的結(jié)構(gòu):


(1)將要創(chuàng)建的節(jié)點的數(shù)據(jù)部分存儲到數(shù)組里,然后創(chuàng)建節(jié)點。讀取數(shù)組,我們將指針指向空的部分當(dāng)作是非法字符,在這里非法字符是‘#’;

(2)如果不是非法字符,則創(chuàng)建節(jié)點并鏈接到二叉樹的根上,按照先序遍歷的方式先創(chuàng)建根,再創(chuàng)建根的左,最后創(chuàng)建根的右。

(3)創(chuàng)建完成后,對二叉樹進(jìn)行相應(yīng)的操作。如:求葉子節(jié)點數(shù),第k層節(jié)點數(shù),四種遍歷方式,遞歸和非遞歸實現(xiàn)等。

三、實現(xiàn)代碼

//BinaryTree.h

#pragma once #include<assert.h> #include<queue> #include<stack> #include<iostream> using namespace std;template<typename T> struct BinaryTreeNode //創(chuàng)建節(jié)點 {T _data;BinaryTreeNode<T> *_left;BinaryTreeNode<T> *_right;BinaryTreeNode(const T& data):_data(data), _left(NULL), _right(NULL){} };template<typename T> class BinaryTree {typedef BinaryTreeNode<T> Node; public:BinaryTree():_root(NULL){}BinaryTree(T* arr,size_t size,const T& invalid = T()){assert(arr);size_t index = 0;_root = CreateTree(arr,size,invalid,index);}BinaryTree(BinaryTree<T> &t){assert(t._root);_root = _Copy(t._root);}//傳統(tǒng)寫法/*BinaryTree<T>& operator=(BinaryTree<T>& t){if (this != &t){Node* tmp = _Copy(t._root);_root = _Destroy(_root);_root = tmp;}return *this;}*///現(xiàn)代寫法BinaryTree<T>& operator=(BinaryTree<T>& t){if (this != &t){BinaryTree<T> tmp(t);std::swap(tmp._root, _root);}return *this;}~BinaryTree(){if (_root){_root = _Destroy(_root);}} public:size_t Size(){return _Size(_root);}size_t Depth(){return _Depth(_root);}void PreOrder(){_PreOrder(_root);cout << endl;}void InOrder(){_InOrder(_root);cout << endl;}void PostOrder(){_PostOrder(_root);cout << endl;}void LevelOrder(){_LevelOrder(_root);cout << endl;}Node* Find(const T& x){return _Find(_root,x);}public://創(chuàng)建二叉樹Node* CreateTree(T* arr, size_t size, const T& invalid,size_t& index){Node* root = NULL;if (index < size){if (arr[index] != invalid){root = new Node(arr[index]);root->_left = CreateTree(arr, size, invalid, ++index);root->_right = CreateTree(arr, size, invalid, ++index);}}return root;}//拷貝二叉樹Node* _Copy(Node* root){Node* cur = NULL;if (root){cur = new Node(root->_data);cur->_left = _Copy(root->_left);cur->_right = _Copy(root->_right);}return cur;}//釋放二叉樹節(jié)點Node* _Destroy(Node* root){if (root != NULL){root->_left = _Destroy(root->_left);root->_right = _Destroy(root->_right);delete root;root = NULL;}return root;}//遞歸求解二叉樹節(jié)點的個數(shù)size_t _Size(Node* root) {if (root == NULL)return 0;return _Size(root->_left) + _Size(root->_right) + 1;}//二叉樹的深度求解size_t _Depth(Node* root){size_t maxDepth = 1;if (root){size_t depth = 1;if (root->_left) //左不為空則遍歷左樹的深度{depth += _Depth(root->_left);}if (depth > maxDepth){maxDepth = depth;}if (root->_right) //右不為空則在左樹的深度基礎(chǔ)上+1{depth = _Depth(root->_right) + 1;}if (depth > maxDepth){maxDepth = depth;}}return maxDepth;}//二叉樹前序遍歷的遞歸實現(xiàn)void _PreOrder(Node* root){if (root){cout << root->_data << " ";_PreOrder(root->_left);_PreOrder(root->_right);}}//二叉樹中序遍歷的遞歸實現(xiàn)void _InOrder(Node* root){if (root){_InOrder(root->_left);cout << root->_data << " ";_InOrder(root->_right);}}//二叉樹后序遍歷的遞歸實現(xiàn)void _PostOrder(Node* root){if (root){_PostOrder(root->_left);_PostOrder(root->_right);cout << root->_data << " ";}}//二叉樹層序遍歷的實現(xiàn)void _LevelOrder(Node* root){queue<Node*> q;if (root)q.push(root);while (!q.empty()){Node* front = q.front();cout << front->_data << " ";q.pop();if (front->_left){q.push(front->_left);}if (front->_right){q.push(front->_right);}}}//二叉樹中查找某個值的節(jié)點Node* _Find(Node* root,const T& data){Node* cur = root;if(root == NULL)return NULL;if(root->_data == data) //找到則返回節(jié)點return root;Node* ret = _Find(cur->_left,data);if(ret == NULL){ret = _Find(cur->_right,data);}return ret;} public:void PreOrderNonR(){_PreOrderNonR(_root);cout<<endl;}void InOrderNonR(){_InOrderNonR(_root);cout<<endl;}void PostOrderNonR(){_PostOrderNonR(_root);cout<<endl;} public://二叉樹前序遍歷的非遞歸實現(xiàn)void _PreOrderNonR(Node* root){Node* cur = root;stack<Node*> s;while(!s.empty() || cur){while(cur){cout<<cur->_data<<" ";s.push(cur);cur = cur->_left;}Node* top = s.top();s.pop();cur = top->_right;}}//二叉樹中序遍歷的非遞歸實現(xiàn)void _InOrderNonR(Node* root){Node* cur = root;stack<Node*> s;while(!s.empty() || cur){while(cur){s.push(cur);cur = cur->_left;}Node* top = s.top();cout<<top->_data<<" ";s.pop();cur = top->_right;}}//二叉樹后序遍歷的非遞歸實現(xiàn)void _PostOrderNonR(Node* root){Node* cur = root;stack<Node*> s;Node* prev = NULL;while(!s.empty() || cur){while(cur){s.push(cur);cur = cur->_left;}Node* top = s.top();if(top->_right == NULL || top->_right == prev){cout<<top->_data<<" ";prev = top;s.pop();}else{cur = top->_right;}}} public:size_t GetKLevelSize(size_t k){assert(_root);size_t level = 1;size_t count = 0;_GetKLevelSize(_root,k,level,count);return count;}//獲取第k層節(jié)點的個數(shù)(當(dāng)k等于層數(shù)level時,count++,否則分別遍歷左樹和右樹)void _GetKLevelSize(Node* root,size_t k,size_t level,size_t& count){if(root == NULL)return;if(k == level){count++;return;}_GetKLevelSize(root->_left,k,level+1,count);_GetKLevelSize(root->_right,k,level+1,count);}size_t GetLeafSize(){size_t count = 0;_GetLeafSize(_root,count);return count;}//獲取葉子節(jié)點(當(dāng)節(jié)點的左樹為空且右樹為空時,即葉子數(shù)加1)void _GetLeafSize(Node* root,size_t& count){if(root == NULL)return;if(root->_left == NULL && root->_right == NULL){count++;return;}_GetLeafSize(root->_left,count);_GetLeafSize(root->_right,count);}size_t SizePrev(){size_t count = 0;_SizePrev(_root,count);return count;}//用引用的方法獲取二叉數(shù)節(jié)點的個數(shù)(需要入棧)void _SizePrev(Node* root,size_t& count){if(root == NULL)return;Node* cur = root;stack<Node*> s;while(!s.empty() || cur){while(cur){s.push(cur);count++;cur = cur->_left;}Node* top = s.top();s.pop();cur = top->_right;}} private:Node* _root; };void FunTest() {int arr[] = {1,2,3,'#','#',4,'#','#',5,6};int arr1[] = { 1, 2,'#', 3, '#', '#', 4, 5,'#',6 ,'#', 7,'#','#',8};BinaryTree<int> b1(arr,sizeof(arr)/sizeof(arr[0]),'#');BinaryTree<int> b6(arr1, sizeof(arr1) / sizeof(arr1[0]), '#');BinaryTree<int> b2(b1);BinaryTree<int> b3;b3 = b2;cout << b1.Size() << endl;cout << b2.Size() << endl;cout << b3.Size() << endl;cout << b1.Depth() << endl;cout << b6.Depth() << endl;cout<<"b1:遞歸先序遍歷->";b1.PreOrder();cout<<"b1:遞歸中序遍歷->";b1.InOrder();cout<<"b1:遞歸后序遍歷->";b1.PostOrder();cout<<"b1:層序遍歷->";b1.LevelOrder();cout<<"b1:非遞歸先序遍歷->";b1.PreOrderNonR();cout<<"b1:非遞歸中序遍歷->";b1.InOrderNonR();cout<<"b1:非遞歸后序遍歷->";b1.PostOrderNonR();cout<<"Find(4)?"<<endl;cout<<b1.Find(4)->_data<<endl;cout<<"GetLeafSize:"<<b1.GetLeafSize()<<endl;cout<<"_SizePrev:"<<b1.SizePrev()<<endl;cout<<"b6:遞歸先序遍歷->";b6.PreOrder();cout<<"b6:遞歸中序遍歷->";b6.InOrder();cout<<"b6:遞歸后序遍歷->";b6.PostOrder();cout<<"b6:遞歸層序遍歷->";b6.LevelOrder();cout<<"第三層節(jié)點數(shù):"<<b6.GetKLevelSize(3)<<endl;cout<<"第四層節(jié)點數(shù):"<<b6.GetKLevelSize(4)<<endl;cout<<"第五層節(jié)點數(shù):"<<b6.GetKLevelSize(5)<<endl;cout<<"GetLeafSize:"<<b6.GetLeafSize()<<endl;cout<<"_SizePrev:"<<b6.SizePrev()<<endl; }
//BinaryTree.cpp

#include<iostream> using namespace std; #include"BinaryTree.h" int main() {FunTest();return 0; }
四、運(yùn)行結(jié)果



前一篇廣義表的數(shù)據(jù)結(jié)構(gòu)和二叉樹的數(shù)據(jù)結(jié)構(gòu)也有一些類似哦。大家可以看看噠^-^



總結(jié)

以上是生活随笔為你收集整理的【数据结构】普通二叉树的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 免费看91视频 | 香蕉视频色| 久久综合高清 | 台湾佬中文在线 | 91亚洲成人 | 国产伦精品一区二区三区视频孕妇 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 欧美亚色 | 国产成人精品免高潮费视频 | 久99| 自拍偷拍一区 | 久久久久久伊人 | 欧美黄色免费视频 | 日本一区二区视频免费 | 欧美怡红院 | 最近免费中文字幕 | 精品久久电影 | 欧美色图网站 | 亚洲第一页色 | 欧美成人黄 | 中国女人毛片 | 欧美日日日 | 亚洲国产婷婷香蕉久久久久久99 | 97精品免费视频 | 久草视频精品 | 韩国禁欲系高级感电影 | 奇米影视77777 | 国产精品久久久国产盗摄 | 国产精品久久久久久久久 | 欧美一级片在线免费观看 | 一区二区三区免费 | 一区二区三区不卡在线观看 | 欧美国产日韩综合 | 国产又粗又猛又爽又黄的视频小说 | 蜜臀在线一区二区三区 | av男人的天堂av | 久久99精品久久久久久 | 欧美福利电影 | 手机看片1024在线 | 亚洲一区二区三区四区五区六区 | 国产免费福利 | 亚洲.www | 欧美色综合天天久久综合精品 | 久久久夜色精品亚洲 | 亚洲中文字幕一区二区在线观看 | 亚洲调教| 午夜偷拍福利 | 青青青手机在线视频 | 性chinese天美传媒麻 | 一区二区三区xxx | 欧美日韩网 | 麻豆精品视频在线观看 | 精品一区二区三区蜜桃 | 国产精品一区二区入口九绯色 | 69性视频 | 成人播放器| 在线欧美色 | 毛片大全免费看 | 奇米色影视 | 国产清纯白嫩初高中在线观看性色 | 欧美一级淫| 亚洲精品久久久久久久久 | 爱如潮水3免费观看日本高清 | 亚洲综合在线成人 | 亚洲 国产 欧美 日韩 | 妻子的性幻想 | 三级黄色小视频 | 国产一级淫片a视频免费观看 | www一级片| 国产永久在线 | 日韩av看片| 成人必看www. | 亚洲最大成人在线视频 | 色图视频 | 天天av综合 | 九九热精品视频在线观看 | 看全黄大色黄大片 | 毛片美女 | 欧美日韩一二三区 | 天堂二区 | 亚洲成人av影片 | 欧美激情性做爰免费视频 | 成人av网站在线观看 | 青青草久久 | 国产精品99久久久久久宅男 | 黄色91视频 | 国产第9页 | 爽爽淫人 | 日本一级片在线播放 | 99热亚洲 | 国产精品第八页 | 99热这里| 欧美激情精品久久久久 | 国内久久精品 | 亚洲h片 | 国产日韩欧美精品在线 | 色二区 | 露脸啪啪清纯大学生美女 | 午夜av一区二区三区 |