LeetCode700. 二叉搜索树中的搜索Golang版
1. 问题描述
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
2. 思路
2.1. 递归思路
- 确定递归函数参数和返回值
func *TreeNode searchBST(root *TreeNode, val int)
- 确定终止条件
if root == nil || root.Val == val {
return root
}
- 确定单层递归逻辑
if root.Val > val, 搜索左子树
if root.Val < val, 搜索右子树
return nil
2.2. 迭代思路
- 一般二叉树迭代法,使用栈来模拟深度优先遍历,使用队列模拟广度优先遍历;二叉搜索树由于其节点的有序性,不需要辅助栈或队列就可以写出迭代法。
- 一般二叉树递归过程中,会有回溯过程,一个分支走到头了,要进行掉头,再走左右分支;对于二叉搜索树,不需要回溯的过程,节点有序性可以确定搜索的方向,也就是搜索某一特定节点时,搜索路径是提前规划好的。
3. 代码
3.1. 递归代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func searchBST(root *TreeNode, val int) *TreeNode {
if root == nil || root.Val == val {
return root
}
if root.Val > val {
return searchBST(root.Left, val)
}
if root.Val < val {
return searchBST(root.Right, val)
}
return nil
}
3.2. 迭代代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func searchBST(root *TreeNode, val int) *TreeNode {
for root != nil {
if root.Val < val {
root = root.Right
} else if root.Val > val {
root = root.Left
} else {
return root
}
}
return nil
}