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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ class类 实现搜索二叉树(BST)

發布時間:2023/12/4 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ class类 实现搜索二叉树(BST) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼如下:

#include <iostream> using namespace std;class BSTNode {private:double key;BSTNode *lchild;BSTNode *rchild;BSTNode *parent;friend class BSTree;public:BSTNode(double k = 0.0, BSTNode *l = nullptr, BSTNode *r = nullptr, BSTNode *p = nullptr): key(k), lchild(l), rchild(r), parent(p) {} };class BSTree {private:BSTNode *root;void inorder_tree_walk(BSTNode *t) {if (t != nullptr) {inorder_tree_walk(t->lchild);cout << t->key << " ";inorder_tree_walk(t->rchild);} }void preorder_tree_walk(BSTNode *t) {if (t != nullptr) {cout << t->key << " ";preorder_tree_walk(t->lchild);preorder_tree_walk(t->rchild);} }void postorder_tree_walk(BSTNode *t) {if(t!=nullptr){postorder_tree_walk(t->lchild);postorder_tree_walk(t->rchild);cout << t->key << " "; } }BSTNode *tree_search_one(BSTNode *t, double k) {if (t == nullptr || k == t->key)return t;if (k < t->key)return tree_search_one(t->lchild,k);elsereturn tree_search_one(t->rchild,k); }BSTNode *tree_search_two(BSTNode *t,double k) {while(t!=nullptr && k!=t->key){if (k < t->key)t = t->lchild;else t = t->rchild;}return t; }BSTNode *tree_min(BSTNode *t) {while(t->lchild!=nullptr)t = t->lchild;return t; }BSTNode *tree_max(BSTNode *t) {while(t->rchild!=nullptr)t = t->rchild;return t; }BSTNode *tree_successor(BSTNode *t) {BSTNode *y;if (t->rchild!=nullptr) return tree_min(t->rchild);y = t->parent;while(y!=nullptr && t==y->rchild){t = y;y = y->parent;}return y; }BSTNode *tree_predecessor(BSTNode *t) {BSTNode *y;y = t->parent;if (t->lchild!=nullptr) return tree_max(t->lchild);while(y!=nullptr && t==y->lchild){t = y;y = y->parent;}return y; }void tree_insert(BSTNode *&t,BSTNode *z) {BSTNode *x = t;BSTNode *y = nullptr;while(x!=nullptr){y = x;if (z->key < x->key) x = x->lchild;else x = x->rchild;}z->parent = y;if (y==nullptr) t = z;else if (z->key < y->key) y->lchild = z;else y->rchild = z; }void transplant(BSTNode *&t,BSTNode *u,BSTNode *v) {if (u->parent==nullptr) t = v;else if (u->parent->lchild==u) u->parent->lchild = v;else u->parent->rchild = v;if (v!=nullptr) v->parent = u->parent; }BSTNode *tree_delete(BSTNode *&t,BSTNode *z) {BSTNode *y = nullptr;if(z->lchild==nullptr) transplant(t,z,z->rchild);else if (z->rchild==nullptr) transplant(t,z,z->lchild);else{y = tree_min(z->rchild);if (y->parent!=z){transplant(t,y,y->rchild);y->rchild = z->rchild;y->rchild->parent = y;}transplant(t,z,y);y->lchild = z->lchild;y->lchild->parent = y;}return z; }void tree_destory(BSTNode *&t){if(t==nullptr) return ;if (t->lchild!=nullptr) return tree_destory(t->lchild);if (t->rchild!=nullptr) return tree_destory(t->rchild);delete t;t = nullptr;}public:BSTree():root(nullptr){}void PreOrder_Tree_Walk(){preorder_tree_walk(root);cout<<endl;}void InOrder_Tree_Walk(){inorder_tree_walk(root);cout<<endl;}void PostOrder_Tree_Walk(){postorder_tree_walk(root);cout<<endl;}BSTNode *Tree_Search(double key){return tree_search_one(root,key);}BSTNode *Iterative_Tree_Search(double key){return tree_search_two(root,key);}BSTNode* Tree_Minimum(BSTNode *x){return tree_min(x); }BSTNode* Tree_Maximum(BSTNode *x){return tree_max(x); }BSTNode *Tree_Successor(BSTNode *x){return tree_successor(x);}BSTNode *Tree_Predecessor(BSTNode *x){return tree_predecessor(x);}void Tree_Insert(double key){BSTNode *z = new BSTNode(key,nullptr,nullptr,nullptr);if (z==nullptr) return ;tree_insert(root,z); }void Tree_Delete(double key){BSTNode *z,*node;z = tree_search_two(root,key);if (z!=nullptr){node = tree_delete(root,z);if (node !=nullptr){delete node;node = nullptr;}}}void Tree_Destory(){tree_destory(root);}~BSTree(){Tree_Destory();} };int main() {int i,j,n;double *arr;BSTree *tree = new BSTree();cout<<"請輸入節點/關鍵字個數:"<<endl;cin>>n;arr = new double[n];cout<<"請依次輸入關鍵字(注意每棵子樹的根節點都要比它的孩子結點先輸入): "<<endl;for (int i = 0;i<n;i++){cin>>arr[i];tree->Tree_Insert(arr[i]);}cout<<endl;cout << "二叉搜索樹先序遍歷的結果為: ";tree->PreOrder_Tree_Walk();cout << "二叉搜索樹中序遍歷的結果為: ";tree->InOrder_Tree_Walk();cout << "二叉搜索樹后序遍歷的結果為: ";tree->PostOrder_Tree_Walk();cout << endl;double seakey;cout<<"請輸入要查找的節點關鍵字:"<<endl;cin>>seakey;BSTNode *seaNode = tree->Tree_Search(seakey);if (seaNode) cout<<"查找成功!"<<endl;else cout << "查找失敗, 關鍵字為" << seakey << "的結點不存在" << endl;cout<<endl;double delkey;cout << "請輸入要刪除的結點關鍵字: " << endl;cin >> delkey;tree->Tree_Delete(delkey);// 通過先序與中序遍歷,或者中序與后序遍歷可以唯一確定一棵二叉樹// 因此此處可以驗證刪除后的二叉搜索樹是否與你預想的一樣cout << "刪除操作后先序遍歷二叉搜索樹的結果為: ";tree->PreOrder_Tree_Walk();cout << "刪除操作后中序遍歷二叉搜索樹的結果為: ";tree->InOrder_Tree_Walk();cout << endl;tree->Tree_Destory(); // 銷毀二叉樹delete[] arr;system("pause");return 0; }

測試結果:



參考于:
https://blog.csdn.net/qq_21396469/article/details/78419609

總結

以上是生活随笔為你收集整理的C++ class类 实现搜索二叉树(BST)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。