Skip to content

700 二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点 root 和一个整数值 val。

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

题解

二叉搜索树中中最重要的特征就是他的中序遍历是有序的,所以基本上是围绕着中序遍历去展开的。

题解1

对应此题,最直接的就是中序遍历然后找到val,这里先给出非递归的中序遍历

javascript
var searchBST = function (root, val) {
    var searchBSTmiddle = function (root) {
        const stack = []
        let result = null
        if (!root) {
            return result
        }
        stack.push(root)
        while (stack.length) {
            const current = stack.pop()
            if (current) {
                if (current.right) {
                    stack.push(current.right)
                }
                //处理中间节点
                stack.push(current)
                //放null表示要处理该节点
                stack.push(null)
                if (current.left) {
                    stack.push(current.left)
                }
            } else {
                const current = stack.pop()
                if (current.val === val) {
                    result = current
                }
            }
        }

        return result
    }
    return searchBSTmiddle(root)
};

题解2

用递归的方法解答,首先不给任何优化,纯粹的深度优先遍历,遍历过所有节点,然后返回符合条件的节点。

javascript
var searchBST = function (root, val) {
    var searchBSTMiddle = function(root, val) {
        if(!root) {
            return root
        }
        if(root.val == val) {
            return root
        }
        const left = searchBSTMiddle(root.left, val)

        const right = searchBSTMiddle(root.right, val)

        return left || right
    }
    return searchBSTMiddle(root, val)
};

利用二叉搜索树的条件进行剪枝。当当前值小于root时,去左子树递归,当当前值大于root时,去右子树递归。

javascript
var searchBST = function (root, val) {
    var searchBSTMiddle = function (root, val) {
        if (!root) {
            return root
        }
        if (root.val == val) {
            return root
        }
        let result
        if (root.val > val) {
            result = searchBSTMiddle(root.left, val)
        } else {
            result = searchBSTMiddle(root.right, val)
        }

        return result
    }
    return searchBSTMiddle(root, val)
};

上次更新于: