文章目录[隐藏]
二叉搜索树
基于二叉树模板实现
查找:
bool search(TreeNode* root, int x){ if(!root){ return false; } if(x == root -> val){ return true; }else if(x < root -> val){ if(search(root -> left, x)){ return true; }else{ return false; } }else{ if(search(root -> right, x)){ return true; }else{ return false; } } }
插入:
void insert(TreeNode* root, int x){ if(!root){ root = new TreeNode(x); return; } if(x == root -> val){ return; }else if(x < root -> val){ insert(root -> left, x); }else{ insert(root -> right, x); } }
建树:
TreeNode* Create(vector<int>& data){ TreeNode* root = nullptr; for(int i = 0; i < data.size(); i++){ insert(root, data[i]); } return root; }
删除:
TreeNode* FindMax(TreeNode* root){ while(root -> right){ root = root -> right; } return root; } TreeNode* FindMin(TreeNode* root){ while(root -> left){ root = root -> left; } return root; } void Delete(TreeNode* &root, int x){ if(!root){ return; } if(root -> val == x){ if(!root -> left && !root -> right){ root = nullptr; }else if(root -> left){ TreeNode* pre = FindMax(root -> left); root -> val = pre -> data; Delete(root -> left, root -> val); }else{ TreeNode* next = FindMin(root -> left); root -> val = next -> data; Delete(root -> right, root -> val); } }else if(root -> val < x){ Delete(root -> right, x); }else{ Delete(root -> left, x); } }
平衡二叉搜索树($AVL$树)
相关实现
//AVL 树 struct AvlNode { int val, height; AvlNode *left; AvlNode *right; AvlNode() : val(0), left(nullptr), right(nullptr), height(1) {} AvlNode(int x, int y) : val(x), left(nullptr), right(nullptr), height(y) {} AvlNode(int x, int y, AvlNode *left, AvlNode *right) : val(x), left(left), right(right), height(y) {} }; int getHeight(AvlNode *root){ if(!root){ return 0; }else{ return root -> height; } } int getBalanceFactor(AvlNode *root){ return getHeight(root -> left) - getHeight(root -> right); } void updataHeight(AvlNode *root){ root -> height = max(getHeight(root -> left), getHeight(root -> right)) + 1; } void RR(AvlNode* &root){ //右右(左单旋) AvlNode* temp = root -> right; root -> right = temp -> left; temp -> left = root; updataHeight(root); updataHeight(temp); root = temp; } void LL(AvlNode* &root){ //左左(右单旋) AvlNode* temp = root -> left; root -> left = temp -> right; temp -> right = root; updataHeight(root); updataHeight(temp); root = temp; } void LR(AvlNode* &root){ RR(root -> left); LL(root); } void RL(AvlNode* &root){ LL(root -> right); RR(root); } void insert(AvlNode* &root, int v){ if(!root){ root = new AvlNode(v); return; } if(v < root -> val){ insert(root -> left, v); updataHeight(root); if(getBalanceFactor(root) == 2){ if(getBalanceFactor(root -> left) == 1){ LL(root); }else if(getBalanceFactor(root -> left) == -1){ LR(root); } } }else{ insert(root -> right, v); updataHeight(root); if(getBalanceFactor(root) == -2){ if(getBalanceFactor(root -> right) == -1){ RR(root); }else if(getBalanceFactor(root -> right) == 1){ RL(root); } } } } AvlNode* Create(vector<int>& data){ AvlNode* root = nullptr; for(int i = 0; i < data.size(); i++){ insert(root, data[i]); } return root; } AvlNode* getPre(AvlNode* root){ if(!root) { return nullptr; } while(root -> right){ root = root -> right; } return root; } void Delete(AvlNode* &root, int v){ if(!root){ return; } if(v < root -> val){ Delete(root -> left, v); updataHeight(root); if(getBalanceFactor(root) == -2){ if(getBalanceFactor(root -> right) == -1){ RR(root); }else if(getBalanceFactor(root -> right) == 1){ RL(root); } } }else if(v > root -> val){ Delete(root -> right, v); updataHeight(root); if(getBalanceFactor(root) == 2){ if(getBalanceFactor(root -> left) == 1){ LL(root); }else if(getBalanceFactor(root -> left) == -1){ LR(root); } } }else{ if(root -> left && root -> right){ AvlNode* pre = getPre(root -> left); root -> val = pre -> val; Delete(root -> left, pre -> val); }else if(!root -> left && !root -> right){ delete root; root = nullptr; }else{ root = root -> left ? root -> left : root -> right; } } if(root){ updataHeight(root); } }