【力扣刷题】700. 二叉搜索树中的搜索

233 阅读2分钟

「这是我参与11月更文挑战的第 1 天,活动详情查看:2021最后一次更文挑战

原题链接

700. 二叉搜索树中的搜索 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

测试用例

给定二叉搜索树:

        4
       / \
      2   7
     / \
    1   3

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

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

参数限制

二叉搜索树特点

二叉搜索树,英文简称 BST,是一棵二叉树,每个节点都有以下特性:

  • 大于左子树上任意一个节点的值
  • 小于右子树上任意一个节点的值

image.png

如图所示,就是一棵二叉搜索树,再标记出他的搜索顺序。而这种遍历的顺序,也可以称之为中序遍历

在二叉树中查找元素,有着数组二分查找同样的性能。以查找一个数 6 为例:

从根节点 5 开始 
-> 比 5 大 
-> 和 5 的右节点 7 比较 
-> 比 7 小 
-> 和 7 的左节点 6 比较 
-> 刚好找到

再以查找一个数 3 为例:

从根节点 5 开始 
-> 比 5 小 
-> 和 5 的左节点 2 比较
-> 比 2 大 
-> 和 2 的右节点 4 比较 
-> 比 4 小 
-> 和 4 的左节点比较 
-> 4 无左节点 
-> 这棵树没有 3 节点

分析

具体的查找思路就是标准的二叉树搜索思路

二叉树的遍历具有非常强烈的递归风格,一个比较通用的遍历框架如下

function trave(root){
    // 如果有逻辑在这里执行,此为前序遍历
    trave(root.left);
    // 如果有逻辑在这里执行,此为中序遍历
    trave(root.right);
    // 如果有逻辑在这里执行,此为后序遍历
}

代码

var searchBST = function(root, val) {
    let n = null;
    trave(root);
    return n;
    function trave(root){
        if(root == null) return;
        if(root.val>val){
            trave(root.left)
        }else if(root.val<val){
            trave(root.right)
        }else{
            n = root;
        }
    }
};

image.png


今天的力扣刷题就分享到这里,感谢大家的阅读~