前两篇介绍了二分搜索树以及二分搜索树的遍历,下面介绍二分搜索树删除最大值和最小值节点
(1)根据二叉树的定义,只要从根节点的左节点一直寻找,直到某一个左节点不再有左节点,那么该节点就是最小值
(2)只要从根节点的右节点一直寻找,直到某一个右节点不再有右节点,那么该节点就是最大值
删除二分搜索树的最小值
(1)如果删除的节点没有右子节点,那么直接删除掉就可以,如下图的最小节点13
(2)如果删除的节点有右节点,那么将该节点删除后,用其右节点替换其位置,如删除最小节点22,22有右节点,删除22后,就把其右节点33替换其位置
删除二分搜索树的最大值
(1)如果删除的节点没有左子节点,那么直接删除掉就可以,如下图的最大节点63
(2)如果删除的节点有左节点,那么将该节点删除后,用其左节点替换其位置,如删除最大节点58,58有左节点,删除58后,就把其左节点50替换其位置
下面是程序实现
#include <iostream>
#include <vector>
#include <string>
#include <ctime> //time()函数
#include <queue>
#include <cassert>
#include "FileOps.h"
using namespace std;
template<typename Key, typename Value>
class BST{
private:
struct Node{
Key key;
Value value;
Node *left;
Node *right;
Node(Key key, Value value){
this->key = key;
this->value = value;
this->left = this->right = NULL;
}
};
Node *root;
int count;
public:
BST(){
root = NULL;
count = 0;
}
~BST(){
// TODO: ~BST()
destroy(root);
}
int size(){
return count;
}
bool isEmpty(){
return count == 0;
}
void insert(Key key, Value value){
root = insert(root,<