之前给大家介绍了搜索二叉树的非递归算法,今天给大家介绍一些搜索二叉树的递归算法的操作。
这里主要介绍的是插入,查找和删除。
其实插入和之前的二叉树的操作是一样的,不过依然是需要判断你要查入的元素应当插入的位置。
int BSTreeInsertR(BSTreeNode** tree, DataType x)
{
if (*tree == NULL)
{
*tree = BuyBSTreeNode(x);
return 0;
}
if ((*tree)->_data > x)
{
return BSTreeInsertR(&(*tree)->_left, x);
}
else if ((*tree)->_data < x)
{
return BSTreeInsertR(&(*tree)->_right, x);
}
else return -1;
}
依然是和非递归一样的判断条件,但是这里和细心的人会发现和非递归的区别,大家都知道二叉树和数组不同不是单纯的将数据放到该放的位置就行了,这里还需要做的是,你要将他的父亲结点和他链接起来,不然等会怎么去找刚插入的结点的呢?非递归的状态下我们是设置了一个parent,大家都知道函数是在栈上开辟空间并且运行的,所以你在当前函数创建一个变量,在下一个函数,或者返回到上一个函数的时候,这个临时变量会随着你栈的销毁而销毁。但是这里并没有parent这个变量,没有说将两个节点链接起来的操作,那他为什么会链接起来了呢?这里就是很巧妙的用了C语言指针的知识。
大家发现,这个函数所传的参数都是二级指针,就是因为二级指针才巧妙的将两个节点连接到了一起。