<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
搜尋二元樹,也稱有序二元樹,排序二元樹,是指一棵空樹或者具有下列性質的二元樹:
1、若任意節點的左子樹不空,則左子樹上的所有節點的值均小於它的根節點的值
2、若任意節點的右子樹不空,則右子樹上的所有節點的值均大於它的根節點的值
3、任意節點的左右子樹也稱為二叉查詢樹。
4、沒有鍵值相等的節點。
5、搜尋二元樹中序遍歷為有序陣列。
結構程式碼實現
template<class K> struct BSTreeNode { BSTreeNode<K>* _left; BSTreeNode<K>* _right; K _key; BSTreeNode(const K& key) :_left(left) ,_right(right) ,_key(key) {} };
在搜尋二元樹b中查詢x的過程
非遞迴實現
typrdef BSTreeNode<K> Node; Node* find(const K& key) { Node*cur =_root; while(cur) { if(cur->_key<key) cur=cur->right; else if(cur->_key>key) cur=cur->left; else return cur; } return nullptr; }
遞迴實現
typrdef BSTreeNode<K> Node; Node* _findr(Node* root,const K& key) { if(root==nullptr) { return nullptr; } if(root->_key<key) { return _findr(root->_right); } else if(root->_key>key) { return _findr(root->_left); } else return root; }
非遞迴實現:
bool insert(const K& key) { if(_root==nullptr) { _root=new Node(key); return true; } Node* parent=nullptr; Node* cur=_root; while(cur) { if(cur->_key<key) { parent=cur; cur=cur->_right; } else if(cur->_key>key) { parent=cur; cur=cur->_left; } else return false; } cur=new Node(key); if(parent->_key<key) { parent->_right=cur; } else parent->_left=cur; return true; }
遞迴實現:
bool _insertR(Node* &root,const K&key) { if(root==NULL) { root=new Node(key); return true; } if(root->_key<key) return _insertR(root->_right,key); else if(root->_key>key) return _insertR(root->_left,key); else return false; }
向一個二元搜尋樹b中插入一個節點s的演演算法,過程為:
重難點
二元搜尋樹的結點刪除比插入較為複雜,總體來說,結點的刪除可歸結為三種情況:
非遞迴實現
bool Erase(const K& key) { Node* parent=nullptr; Node* cur=_root; while(cur) { if(cur->_key<key) { parent=cur; cur=cur->_right; } else if(cur->_key>key) { parent=cur; cur=cur->left; } else { //找到了,開始刪除 if(cur->_left==nullptr) { if(cur==_root) { _root=cur->_right; } else { if(parent->_left==cur) { parent->_left=cur->_right; } else { parent->_right=cur->_right; } } delete cur; } else if(cur->_right==nullptr) { if(cur==_root) { _root=cur->_left; } else { if(parent->_left==cur) { parent->_left=cur->_left; } else { parent->_right=cur->_right; } } } else //左右都不為空 { Node* minRight=cur->_right; while(minRight->_left) { minRight=minRight->_left; } k min = minRight->_key; this->Erase(min); cur->_key=min; } return true; } } return false; }
遞迴實現
// 如果樹中不存在key,返回false // 存在,刪除後,返回true bool _EraseR(Node*& root, const K& key) { if(root==nullptr) return false; if(root->_key<key) return _EraseR(root->_right,key); else if(root->_key>key) return _EraseR(root->_left,key); else { //找到了,root就是要刪除的節點 if(root->_left == nullptr) { Node* del=root; root=root->_right; delete del; } else if(root->_right==nullptr) { Node* del = root; root=root->_left; delete del; } else { Node* minRight=root->_right; while(minRight->_left) { minRight=minRight->_left; } K min=minRight->_key; //轉化為root的右子樹刪除min _EraseR(root->_right,min); root->_key=min; } return true; } }
到此這篇關於C++ 詳解資料結構中的搜尋二元樹的文章就介紹到這了,更多相關C++ 搜尋二元樹內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45