最近在复习红黑树,红黑树实现的代码实在是过多,插入又要左旋右旋,又要变颜色什么的,这里我先对二叉搜索树的操作进行回忆和整理,然后在是avl,再到红黑树。
对于二叉搜索树,构建一颗二叉搜索树和查找二叉搜索树中的某个值都是十分简单的操作,在这里主要写一下二叉搜索树的删除和插入操作,当然这其中的操作,肯定是二叉搜索树的删除操作显得更加复杂一点:
删除remove:
对于删除操作,主要就是主要一下几点:
第一:如果目标值比当前节点值要小,就在当前节点的左子树下面寻找。
第二:如果目标值比当前节点值要大,就在当前节点的右子树下面寻找。
第三:如果目标值跟当前节点值一样大,那么又分以下几种情况:
一,如果当前节点左子树和右子树都为空,那么直接把当前节点delete。
二,如果当前节点的左子树和右子树有一个不为空,那么,如果当前节点的左子树为空,则让一个临时节点指向当前节点,当前节点指向当前节点的右节点,然后delete临时节点。如果当前节点的右子树为空,让一个临时节点指向当前节点,当前节点指向当前节点的左节点,然后delete临时节点。
三,如果当前节点的左子树和右子树都不为空,那么,我们既可以找左子树里的最大值,也可以找右子树里的最小值,交换两节点值,然后对交换的子树进行递归删除操作。
下面上代码:
TreeNode* deletendoe(TreeNode* root,int key){
if(root==nullptr) return root;
if(root->val>key) root->left=deletenode(root->left,key);
else if(root->val<key) root->right=deletenode(root->right,key);
else{
if(root->left==nullptr||root->right==nullptr){
TreeNode* tmp=root;
if(root->left==nullptr)
root=root->right;
else
root=root->left;
delete(tmp);
}
else{
TreeNode* tmp=root->right;
while(tmp->left!=nullptr)
tmp=tmp->left;
root->val=tmp->val;
root->right=deletenode(root->right,root->val);
}
}
return root;
}
插入insert:
对于插入操作,就简单多了,基本上就是一点:
如果当前节点为空,直接new一个新节点为插入值。
如果当前节点不为空:
如果当前节点的值等于插入值,直接return;
如果当前节点的值小于插入值,递归右子树。
如果当前节点的值大于插入值,递归左子树。
下面上代码:
TreeNode* insertnode(TreeNode* root,int key){
if(root==nullptr)
return new TreeNode(key);
TreeNode* tmp=root;
while(true){
if(root->val>key){
if(root->left!=nullptr)
root=root->left;
else {
root->left=new TreeNode(key);
break;
}
}
else{
if(root->right!=nullptr)
root=root->right;
else {
root->right=new TreeNode(key);
break;
}
}
}
return tmp;
}