這篇文章將為大家詳細(xì)講解有關(guān)C++中怎么實(shí)現(xiàn)搜索二叉樹,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元內(nèi)丘做網(wǎng)站,已為上家服務(wù),為內(nèi)丘各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108二叉查找樹(英語:Binary Search Tree),也稱二叉搜索樹、有序二叉樹(英語:ordered binary tree),排序二叉樹(英語:sorted binary tree),是指一棵空樹或者具有下列性質(zhì)的二叉樹:
任意節(jié)點(diǎn)的左子樹不空,則左子樹上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值;
任意節(jié)點(diǎn)的右子樹不空,則右子樹上所有結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值;
任意節(jié)點(diǎn)的左、右子樹也分別為二叉查找樹;
沒有鍵值相等的節(jié)點(diǎn)。
#pragma once templatestruct BSTreeNode { K _key; V _value; BSTreeNode * _left; BSTreeNode * _right; BSTreeNode(const K& key, const V& value) :_key(key) ,_value(value) ,_left(NULL) ,_right(NULL) {} }; template class BSTree { typedef BSTreeNode Node; public: BSTree() :_root(NULL) {} bool Insert(const K& key, const V& value) { if (NULL == _root)//若為空樹 { _root = new Node(key, value); return true; } Node* parent = NULL; Node* cur = _root; //確定插入節(jié)點(diǎn)的位置 while (cur) { if (key < cur->_key) { parent = cur; cur = cur->_left; } else if (key > cur->_key) { parent = cur; cur = cur->_right; } else//已經(jīng)存在key { return false; } } //插入節(jié)點(diǎn) if (key > parent->_key) parent->_right = new Node(key, value); else parent->_left = new Node(key, value); } //Insert遞歸寫法 bool InsertR(const K& key, const V& value) { return _InsertR(_root, key, value); } bool _InsertR(Node*& root, const K& key, const V& value) { if (NULL == root) { root = new Node(key, value); return true; } if (key > root->_key) return _InsertR(root->_right, key, value); else if (key < root->_key) return _InsertR(root->_left, key, value); else return false; } Node* Find(const K& key) { Node* cur = _root; while (cur) { if (key > cur->_key) cur = cur->_right; else if (key < cur->_key) cur = cur->_left; else return cur; } return NULL; } //Find遞歸寫法 Node* FindR(const K& key) { return _FindR(_root, key); } Node* _FindR(Node* root, const K& key) { if (NULL == root) return NULL; if (key > root->_key) return _FindR(root->_right, key); else if (key < root->_key) return _FindR(root->_left, key); else return root; } bool Remove(const K& key) { Node* parent = NULL; Node* cur = _root; //確定刪除節(jié)點(diǎn)的位置 while (cur) { if (key > cur->_key) { parent = cur; cur = cur->_right; } else if (key < cur->_key) { parent = cur; cur = cur->_left; } else { break; } } if (NULL == cur)//沒有該節(jié)點(diǎn) { return false; } Node* del; if (NULL == cur->_left)//刪除節(jié)點(diǎn)的左孩子為空 { del = cur; //刪除的節(jié)點(diǎn)為根節(jié)點(diǎn) if (NULL == parent) { _root = _root->_right; } else { if (cur == parent->_left) parent->_left = cur->_right; else parent->_right = cur->_right; } } else if (NULL == cur->_right)//刪除節(jié)點(diǎn)的右孩子為空 { del = cur; if (NULL == parent) { _root = _root->_left; } else { if (cur == parent->_left) parent->_left = cur->_right; else parent->_right = cur->_left; } } else//刪除節(jié)點(diǎn)的左右孩子都不為空,找右子樹最左節(jié)點(diǎn)代替該節(jié)點(diǎn)刪除 { parent = cur; Node* leftmost = cur->_right; while (leftmost->_left) { parent = leftmost; leftmost = leftmost->_left; } del = leftmost; cur->_key = leftmost->_key; cur->_value = leftmost->_value; if (leftmost == parent->_left) parent->_left = leftmost->_right; else parent->_right = leftmost->_right; } return true; } //Remove遞歸寫法 bool RemoveR(const K& key) { return _RemoveR(_root, key); } bool _RemoveR(Node*& root, const K& key) { if (NULL == root) return false; if (key > root->_key) { return _RemoveR(root->_right, key); } else if (key < root->_key) { return _RemoveR(root->_left, key); } else { Node* del = root; if (NULL == root->_left) { root = root->_right; } else if (NULL == root->_right) { root = root->_left; } else { Node* leftmost = root->_right; while (leftmost->_left) { leftmost = leftmost->_left; } swap(root->_key, leftmost->_key); swap(root->_value, leftmost->_value); return _RemoveR(root->_right, key); } delete del; } return true; } //中序遍歷遞歸寫法 void InOrder() { _InOrder(_root); } void _InOrder(Node* root) { if (NULL == root) return; _InOrder(root->_left); cout< _key<<" "; _InOrder(root->_right); } protected: Node* _root; }; void Test() { BSTree t; int a[] = {5, 3, 4, 1, 7, 8, 2, 6, 0, 9}; for (size_t i = 0; i < sizeof(a)/sizeof(a[0]);++i) { t.InsertR(a[i], i); } cout< _key< _key< _key< 關(guān)于C++中怎么實(shí)現(xiàn)搜索二叉樹就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:C++中怎么實(shí)現(xiàn)搜索二叉樹-創(chuàng)新互聯(lián)
本文地址:http://weahome.cn/article/hesoi.html