二叉搜索树(LeetCode相关题解(递归求解))

前言

  • LeetCode 700:二叉搜索树中的搜索
  • LeetCode 701:二叉搜索树的插入操作
  • LeetCode 450:删除二叉搜索树中的节点
  • LeetCode 108:将有序数组转换成二叉搜索树

一、什么是二叉搜索树

1、空树是二叉搜索树

2、若不为空则应具有以下3条性质:

  • 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;
  • 若它的右子树不为空,则右子树上所有节点的值均小于它的根节点的值;
  • 它的左右子树也均为二叉搜索树.

前提:二叉搜索树首先是一个二叉树。

二、二叉搜索树的操作

1.查找(递归查找是否存在key值)

LeetCode 700题:二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,

给定二叉搜索树:

    4
   / \
  2   7
 / \
1   3

和值: 2
你应该返回如下子树:

  2     
 / \   
1   3

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。

(1)解题思路:

本题首先根据给定的根节点查找到目标节点key:二叉搜索树中的查找不需要遍历所有节点,二叉搜索树是一棵排序树,其中序遍历的结果是一个从小到大排序的数组,故在二叉搜索树中查找某个key值只需要搜索一条路径。
然后返回查找到的节点,完毕。

(2)代码如下:
class Solution {
   
public:
    TreeNode* traversal(TreeNode* cur,int val){
   
        if(cur==NULL) return NULL;//终止程序的条件
        if(cur->val>val){
   //若当前节点的值>val,则说明val存在于当前节点的左子树中,故需要向左查找
            return searchBST(cur->left,val);
        }else if(cur->val<val){
   //若当前节点的值<val,则说明val存在于当前节点的右子树中,故需要向右查找
            return searchBST(cur->right,val);
        }else{
   //若当前节点的值==val,则返回当前节点
            return cur;
        }
    }
    TreeNode* searchBST(TreeNode* root, int val) {
   
        return traversal(root,val);
    }
};

举例说明:
给定二叉搜索树:

    4
   / \
  2   7
 / \
1   3

和值: 2

若需要找到其树中值为2的节点,只需要从根节点向左查找到值为2节点即可,不需要向右查找,因为根节点右子树上节点的值均大于根节点的值,故对于二叉搜索树的查找操作只需要搜索一条路径,不需要遍历整棵树。

(3)递归步骤(以上述例子为例):
  • 当 cur==root 时为0层,递归函数 traversal 执行到 return searchBST(cur->left,val); 进入1层递归;
  • 当 cur==root->left 时为1层,递归函数 traversal 执行到 return cur; 得到了1层递归的返回值cur(cur为root->left),此时递归函数进入0层;
  • 此时 cur==root 为0层,只有0层时的return才会结束递归函数
(4)注意:

具有返回值的递归函数要牢记递归函数定义以及递归函数返回值是什么,在本题中递归函数的定义是:

  • 找到值等于val的节点(所以 return searchBST(cur->left,val); 表示程序最终返回了值为val的节点,实际上函数到达0层的这条语句就结束了)

递归函数的返回值是什么:

  • 若能找到节点,则返回值为值等于val的节点;
  • 若不能找到节点,则返回值为NULL节点。

2.插入(原树中不存在key,插入key)

LeetCode 701:二叉搜

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值