具体的算法只提供有关插入、查找的算法,因为考试会考,其他做好非代码级的理解就好,如有必要我会在最近两天更新,这两天没更,就是不会更了。
1.创建
创建一棵二叉树遵循:元素按顺序逐个放入,第一个为根节点,然后后面每个进来的比他大的放右边,比它小的放左边,进行下沉操作,它的每棵子树也是一样。如图:
2.插入
其实创建的实质就是不断地插入。
插入操作很好理解,我们先看下面的图:
就是说,二叉树的插入是不会改变原来那些树的位置,他会根据待插入值的大小比较选择在适当的位置,还是上面那幅图,如果要插入的是2.5:
1. 5 比2.5大,所以往左子树放
2. 3比2.5大,继续往左子树放
3. 1比2.5小,所以待插入节点向右运动至节点2
4. 2比2.5小,所以待插入节点继续向右运动,所以应该将2.5作为2的右子树处理。
下面看一下用递归实现的二叉搜索树插入的实现代码:
bool _Insert_R(Node*& root, const K& key, const V& value)
{
if (root == NULL)//根为空说明没有值,直接作根节点插入,也相当于递归出口
{
root = new Node(key, value); //new一个出来
return true;
}
if (root->_key > key)//如果待插入节点键值小于当前节点键值
{
return _Insert_R(root->_left, key, value);//就插入到左子树
}
else if(root->_key < key)//如果插入结点键值大于当前节点键值
{
return _Insert_R(root->_right, key, value);//就插入到右子树
}
else
{
return false;//一般情况不会用到
}
}
3.删除
关于删除我们可以参考如下的例子
看完了,上面的图,我们很容易得出以下结论:
删除掉一个节点后我们可以:
1. 用被删节点左子树的根节点取代他的位置,这样一来,右子树依旧比现在的根节点大,而左子树呢,仍然小于根节点
2.用被删节点的右子树的中最小的那个节点(即右子树的最左节点)取代它的位置,这样仍然可以保证是符合要求的。
4.查找
查找主要是靠递归实现的,代码如下:
Node* _Find_R(Node* root, const K& key)
{
if (root == NULL)
{
return NULL;
}
if (root->_key > key)//如果查找值小于当前节点的值
{
return _Find_R(root->_left, key);//返回他的左子树继续查找
}
else if (root->_key < key)//如果查找值大于当前节点的值
{
return _Find_R(root->_right, key);//返回他的右子树继续查找
}
else
{
return root;//就是找到,直接递归回去
}
}
好啦,希望我的二叉搜索树的相关注释可以帮助你顺利通过今年的数据结构考试!