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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

深入理解二叉搜索树

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解二叉搜索树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是二叉搜索樹?

顧名思義,一顆二叉搜索樹是基于二叉樹來組織的,它包括許多動態集合操作(Search,MiniNum, MaxiNum, Prodecessor, Successor, Insert 和Delete等)。二叉搜索樹上的基本操作所花費的時間與這棵樹的高度成正比,對呀有n個節點組成的完全二叉樹來說,這些操作的最壞的運行時間是O(lg n)。

如圖所示是一個搜索二叉樹的結構。一個二叉樹每一個節點就是一個對象,包含的屬性有左結點(left),右結點right)和父結點(parent)以及這個節點的關鍵值(key)。在上圖中,根節點的關鍵值是6,左結點是5,右結點是8,父節點為空。這是一顆完全(除葉子結點外所有節點都存在左右結點)的搜索二叉樹,要注意的是,二叉搜索樹的左結點值小于等于根結點的值,而右結點的值大于等于根結點的值。搜索二叉樹的性質允許我們通過一個簡單的遞歸算法(中序遍歷)就可以得到樹中的所有關鍵字。一個二叉樹結構在C++中可以表示成如下:

struct BinaryTreeNode{int val; //keyBinaryTreeNode *left; //left NodeBinaryTreeNode *right; //right Node };

?

搜索二叉樹的遍歷

中序遍歷:左——根——右,根結點在中間遍歷,上圖中二叉樹經過中序遍歷得到的是:4,5,5,6,7,8,9.

前序遍歷:根——左——右,根結點在前面的遍歷,上圖中二叉樹經過前序遍歷得到的是:6,5,4,5,8,7,8。

后序遍歷:左——右——根,根結點在后面的遍歷,上圖中二叉樹經過后序遍歷得到的是:4,5,5,7,9,8,6.

//前序遍歷二叉樹 void TreeWalk(BinaryTreeNode *root) { if(root==nullptr) return;vector<int>tree;tree.push_back(root->val);if(root->left) TreeWalk(root->left);if(root->right) TreeWalk(root->right);return; }//中序遍歷二叉樹 void TreeWalk(BinaryTreeNode *root) { vector<int>tree; if(root->left!=nullptr)TreeWalk(root->left);tree.push_back(root->val);TreeWalk(root->right);return; }//后序遍歷二叉樹 void TreeWalk(BinaryTreeNode *root) { vector<int>tree; if(root->left!=nullptr)TreeWalk(root->left);TreeWalk(root->right);tree.push_back(root->val);return; }

查詢二叉搜索樹

如何查詢二叉搜索樹中的最小值,最大值,或者任意一個值?

查詢最小值,根據二叉搜索樹的性質可以知道,搜索二叉樹的最小值為最左邊葉子結點的值。同理,我們知道二叉搜索樹的最大值為最右邊葉子結點的值。代碼如下:

//最小值 int GetMiniNum(BinaryTreeNode* root) { while(root->left!=nullptr) root=root->left;return root->val; }//最大值 int GetMaxiNum(BinaryTreeNode *root) {while(root->right!=nullptr) root=root->right;return root->val; }

查詢二叉搜索樹中的任意一個值(相當于數組查詢的二分法),時間復雜度最差為O(depth),depth為二叉樹的深度。代碼如下:

BinaryreeNode * Search(BinaryTreeNode *root,int k) {if(root==nullptr||root->val==k) return root;if(k<root->val)Search(root->left,k);elseSearch(root->right,k); }

二叉搜索樹的插入和刪除

要將一個新值x插入到二叉搜索樹中,需要調用Search操作。

void InsertTreeNode(BinaryTreeNode *root, k) {BinaryTreeNode *ToBeInsert=new BinaryTreeNode(k);BinaryTreeNode *pCur=root;while(pNode!=nullptr){ BinaryTreeNode *pNode=pCur;if(pCur->val>k){ pCur=pCur->left;if(pCur==nullptr)pCur->left=ToBeInsert;}else {pCur=pCur->right;if(pCur==nullptr)pCur->right=ToBeInsert;}} }

?

總結

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

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