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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构 -- 搜索二叉树

發布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 -- 搜索二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、搜索二叉樹

1、定義:它是一棵排序二叉樹,可為空樹。

2、性質:

  • 每個節點都有一個作為搜索依據的關鍵碼(key),所有節點的關鍵碼互不相同;

  • 左子樹上所有節點的關鍵碼(key)都小于根節點的關鍵碼(key);

  • 右子樹上所有節點的關鍵碼(key)都大于根節點的關鍵碼(key);

  • 左、右子樹都是二叉搜索樹。


二、源代碼

1、定義節點

template<class?K,class?V> struct?BSTreeNode {BSTreeNode<K,V>?*_left;//左節點BSTreeNode<K,V>?*_right;//右節點K?_key;//節點權值V?_value;BSTreeNode(const?K&?key,const?V&?value):_key(key),_value(value),_left(NULL),_right(NULL){} };

2、搜索二叉樹及其相關實現

template<class?K,class?V> class?BSTree {typedef?BSTreeNode<K,V>?Node; public:BSTree():_root(NULL){}//非遞歸Node*?Find(const?K&?key){return?_Find(_root,key);}bool?Insert(const?K&?key,const?V&?value){return?_Insert(_root,key,value);}bool?Remove(const?K&?key){return?_Remove(_root,key);}//遞歸bool?InOrder()?//中序遍歷?-->?有序序列{return?_InOrder(_root);cout<<endl;}Node*?FindR(const?K&?key){return?_FindR(_root,key);}bool?InsertR(const?K&?key,const?V&?value){return?_InsertR(_root,key,value);}bool?RemoveR(const?K&?key){return?_RemoveR(_root,key);} protected://非遞歸Node*?_Find(Node?*root,const?K&?key){if(root?==?NULL)?return?NULL;Node?*cur=root;if(cur->_key?>?key){cur=cur->_right;}else?if(cur->_key?<?key){cur=cur->_left;}else?{return?cur;}return?NULL;} bool?_Insert(Node?*&root,const?K&?key,const?V&?value){if(root?==?NULL){root=new?Node(key,value);return?true;}Node?*cur=root;Node?*parent=NULL;while(cur){if(cur->_key?<?key){parent=cur;cur=cur->_right;}else?if(cur->_key?>?key){parent=cur;cur=cur->_left;}elsereturn?false;}if(parent->_key?<?key){parent->_right=new?Node(key,value);parent->_right=parent;}else{parent->_left=new?Node(key,value);parent->_left=parent;}return?true;}bool?_Remove(Node*&?root,const?K&?key?){if(root?==?NULL)?return?false;Node?*cur=root;Node?*parent=NULL;while(cur)?//找節點{if(cur->_key?>?key){parent=cur;cur=cur->_left;}else?if(cur->_key?<?key){parent=cur;cur=cur->_right;}else?//找到節點{if(cur->_left?==?NULL)//左為空{if(parent?==?NULL)root=cur->_right;else?if(parent->_left?==?cur)parent->_left=cur->_right;elseparent->_right=cur->_right;}else?if(cur->_right?==?NULL)//右為空{if(parent?==?NULL)root=cur->_left;else?if(parent->_left?==?cur)parent->_left=cur->_left;elseparent->_right=cur->_left;}else?//左右都不為空{Node?*parent=cur;Node?*left=cur->_right;//右子樹的最左節點while(left->_left){left=left->_left;}cur->_key=left->_key;//替換結點cur->_value=left->_value;if(parent->_left?==?left)parent->_left=left->_left;elseparent->_right=left->_right;delete?left;}}return?true;}return?false;}//遞歸bool?_InOrder(Node?*root){if(root?==?NULL)?return?false;_InOrder(root->_left);cout<<root->_left<<"?";_InOrder(root->_right);return?true;}Node*?_FindR(Node?*root,const?K&?key){if(root?==?NULL)?return?NULL;if(root->_key?==?key)return?root;else?if(root->_key?>?key)return?_FindR(root->_left,key);elsereturn?_FindR(root->_right,key);}bool?_InsertR(Node?*root,const?K&?key,const?V&?value){if(root?==?NULL)?{root=new?Node(key,value);return?true;}if(root->_key?>?key)return?_InsertR(root->_left,key,value);else?if(root->_key?<?key)return?_InsertR(root->_right,key,value);elsereturn?false;}bool?_RemoveR(Node?*root,const?K&?key){if(root?==?NULL)?return?false;if(root->_key?>?key)return?_RemoveR(root->_left,key);?else?if(root->_key?<?key)return?_RemoveR(root->_right,key);else??//找到節點{Node?*del=NULL;if(root->_left?==?NULL)?root=root->_right;else?if(root->_right?==?NULL)root=root->_left;else?{Node?*parent=NULL;Node?*left=root;while(left->_left){parent=left;left=left->_left;}root->_key=left->_key;root->_value=left->_value;del=left;if(parent->_left?==?left)parent->_left=left->_left;elseparent->_right=left->_right;delete?del;return?true;}}return?false;} protected:Node?*_root; };

3、總結:

????搜索二叉樹是一棵排序二叉樹,可為空樹。它的每一個節點都遵從搜索二叉樹的性質。

????搜索二叉樹的中序遍歷后為升序序列;其查找根據key值以及性質進行;其插入需先根據其key值找到插入的節點,隨后添加節點,另外其key值唯一;

????其刪除節點時,需分3種情況:

???(1)僅左為空;

?? (2)僅右為空;

? ?(3)該節點左右皆不為空。

????????刪除該節點,即需 找到 右子樹的最左節點 或 左子樹的最右節點,作為替換結點。

轉載于:https://blog.51cto.com/zxtong/1829779

總結

以上是生活随笔為你收集整理的数据结构 -- 搜索二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

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