插入元素过程
1.插入节点不存在
比较插入的元素和当前节点的大小,如果比当前节点大,则比较元素和节点的右孩子,否则比较左孩子。循环,直到找到一个节点为空,将值插入进去
例:60和根元素做比较,60比41大,所以肯定要插入到右侧
60跟58做比较,比58大,说明要插入到58的右侧,58没有右孩子,所以60插入进去
2.如果插入的元素在树中已经存在了,则是找到那个节点,更改对应的value值
实现
#include <iostream>
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->right=this->left=NULL;
}
Node(Node* node) //构造函数
{
this->key=node->key;
this->value=node->value;
this->right=node->right;
this->left=node->left;
}
};
Node* root;//树的根节点
int count;//树的节点数
public:
BST()
{
count=0;
root=NULL;
}
int size()
{
return count;
}
bool isEmpty()
{
return count==0;
}
//向树中插入节点
void insert(Key key,Value value)
{
root=insert(root,key,value);
}
private:
//在以node为根节点的树中插入节点
//返回插入新节点后二叉树的根
Node* insert(Node* node, Key key,Value value)
{
if(node==NULL) //找到了为空节点的位置
{
count++;
return new Node(key,value);
}
if(node->key==key)
node->value = value;//如果插入的key已经存在于树上,更新value的值
else if(node->key>key) //往左子树插入元素
node->left = insert(node->left,key,value);
else//往右子树插入元素
node->right = insert(node->right,key,value);
return node;
}
};