深入理解二叉搜索树
什么是二叉搜索樹?
顧名思義,一顆二叉搜索樹是基于二叉樹來組織的,它包括許多動態集合操作(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;}} }?
總結
- 上一篇: 山药大米粥的功效与作用、禁忌和食用方法
- 下一篇: H.266/VVC