二叉搜索树的节点插入,查找。
2017-12-04 21:19
417 查看
在讲解二分搜索树之前,我想先讲清楚一个东西,那就是递归,因为在后面的插入,查找操作都是利用递归去查找的,而且对于递归的理解也是一个难点,因此,以下是我对于递归的理解。
,对于递归,我们不能用人脑去展开来想,所以,我们只需要把递归过程中的两个过程给想清楚就好了,一个是递归发生在终止条件的时候,还有一个是递归在不断缩小规模的过程中其中的一个情况,具体我们可以见下图:
我们把最下面的方框理解为递归的出口,也就是递归发生终止时的情况,而上面的方框,我们理解为在终止条件发生前的前一个情况,因为一个人递归操作就是由这两种情况组成的,因此,我们只需要理清上面的两种情况就能够很好的理解递归了。
对于涉及到递归的问题,我们可以按照上图的思路来写出递归函数。
1.对终止条件进行判断 if(终止条件成立)
2.如果有必要的话,对传入的参数改造,或者自己产生参数
3.把我们产生的目标参数返回给上一层
4.接受来自上上层传递过来的参数
5.对传递过来的参数进行改造,把目标参数发往下一层级
6.接受下一层级往上传过来的目标参数,有必要的话对其利用或者改造。
7.把目标参数(需要返回的参数)发往上一层。
理解了上面的7点后,对于下面的递归操作就不难理解了。
我们首先来看看往二叉树中插入节点的方法:
第一点:对终止条件进行判断 if(终止条件成立)。
if(
node == NULL
)
第二点:如果有必要的话,对传入的参数改造,或者自己产生参数。
newNode(key,
value)
第三点:把我们产生的目标参数返回给上一层。
returnnew
Node(key, value);
第四点:接受来自上上层传递过来的参数。
Node
*node, Key key, Value value
第五点:对传递过来的参数进行改造,把目标参数发往下一层级。
insert(
node->left , key, value);
insert(
node->right, key, value)
第六点:接受下一层级往上传过来的目标参数,有必要的话对其利用或者改造。
node->left
= insert(
node->left , key, value);
node->right
= insert(
node->right, key, value);
第七点:把目标参数(需要返回的参数)发往上一层。
return
node;
根据以上的分析,我们发现递归函数大多符合上面的七点,因此我们只要按照上面的7
点为根本,然后再加上一些额外的操作,则一个递归函数差不多就写好了。
二叉树的查找(查找二叉树中是否存在某个key):
二叉搜索树的查找(查找树中key相对应的value):
,对于递归,我们不能用人脑去展开来想,所以,我们只需要把递归过程中的两个过程给想清楚就好了,一个是递归发生在终止条件的时候,还有一个是递归在不断缩小规模的过程中其中的一个情况,具体我们可以见下图:
我们把最下面的方框理解为递归的出口,也就是递归发生终止时的情况,而上面的方框,我们理解为在终止条件发生前的前一个情况,因为一个人递归操作就是由这两种情况组成的,因此,我们只需要理清上面的两种情况就能够很好的理解递归了。
对于涉及到递归的问题,我们可以按照上图的思路来写出递归函数。
1.对终止条件进行判断 if(终止条件成立)
2.如果有必要的话,对传入的参数改造,或者自己产生参数
3.把我们产生的目标参数返回给上一层
4.接受来自上上层传递过来的参数
5.对传递过来的参数进行改造,把目标参数发往下一层级
6.接受下一层级往上传过来的目标参数,有必要的话对其利用或者改造。
7.把目标参数(需要返回的参数)发往上一层。
理解了上面的7点后,对于下面的递归操作就不难理解了。
我们首先来看看往二叉树中插入节点的方法:
// 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法 // 返回插入新节点后的二分搜索树的根 Node* insert(Node *node, Key key, Value value){ if( node == NULL ){ count ++; return new Node(key, value); } if( key == node->key ) node->value = value; else if( key < node->key ) node->left = insert( node->left , key, value); else // key > node->key node->right = insert( node->right, key, value); return node; } };
第一点:对终止条件进行判断 if(终止条件成立)。
if(
node == NULL
)
第二点:如果有必要的话,对传入的参数改造,或者自己产生参数。
newNode(key,
value)
第三点:把我们产生的目标参数返回给上一层。
returnnew
Node(key, value);
第四点:接受来自上上层传递过来的参数。
Node
*node, Key key, Value value
第五点:对传递过来的参数进行改造,把目标参数发往下一层级。
insert(
node->left , key, value);
insert(
node->right, key, value)
第六点:接受下一层级往上传过来的目标参数,有必要的话对其利用或者改造。
node->left
= insert(
node->left , key, value);
node->right
= insert(
node->right, key, value);
第七点:把目标参数(需要返回的参数)发往上一层。
return
node;
根据以上的分析,我们发现递归函数大多符合上面的七点,因此我们只要按照上面的7
点为根本,然后再加上一些额外的操作,则一个递归函数差不多就写好了。
二叉树的查找(查找二叉树中是否存在某个key):
// 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法 bool contain(Node* node, Key key){ if( node == NULL ) return false; if( key == node->key ) return true; else if( key < node->key ) return contain( node->left , key ); else // key > node->key return contain( node->right , key ); }
二叉搜索树的查找(查找树中key相对应的value):
// 在以node为根的二分搜索树中查找key所对应的value, 递归算法 // 若value不存在, 则返回NULL Value* search(Node* node, Key key){ if( node == NULL ) return NULL; if( key == node->key ) return &(node->value); else if( key < node->key ) return search( node->left , key ); else // key > node->key return search( node->right, key ); } };
相关文章推荐
- 数据结构与算法分析(Java语言描述)(16)—— 二叉搜索树基础、节点插入、查找
- 二叉搜索树的相关操作:插入节点,删除节点,排序,查找,最大值,最小值,前序,中序,后序遍历(主要用到递归的方法)
- 【c++】二叉搜索树的插入、查找、非递归删除
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 二叉搜索树Java实现(查找、插入、删除、遍历)
- 链表之节点插入、查找删除、遍历打印、遍历释放
- 二叉搜索树查找,插入,删除
- #笔记#圣思园 JavaWeb 第72讲——jQuery和DOM,查找、插入、删除、复制、替换、包裹节点
- Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作
- 二叉查找树带父节点指针的创建,销毁,查找,删除,插入,找前驱后继,找最小值最大值(递归和非递归的实现)
- 【数据结构】二叉搜索树的插入,删除,查找等基本操作的实现
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 查找节点和创建、插入节点
- 【二叉树】二叉搜索树创建、插入、删除、查找等操作
- 11.21课堂笔记-查找节点和创建节点、插入节点和删除节点、复制节点替换节点、包裹节点和属性操作、样式操作、设置和获取HTML、文本和值
- 二叉树问题---二叉搜索树查找、插入与删除的代码实现
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作
- 【二叉树】二叉搜索树创建、插入、删除、查找等操作