700. 二叉搜索樹中的搜索
給定二叉搜索樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點爲根的子樹。 如果節點不存在,則返回 NULL。
例如:
給定二叉搜索樹:
4
/ \
2 7
/ \
1 3
和值: 2
你應該返回如下子樹:
2
/ \
1 3
在上述示例中,如果要找的值是 5,但因爲沒有節點值爲 5,我們應該返回 NULL。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/search-in-a-binary-search-tree/
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
-
創建二叉搜索樹
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
-
1. 遞歸法
思路:
- 遞歸終止條件:當前節點爲 null
- 比較當前節點的值和要查找的值,如果相等,則就是我們要找的節點,返回該節點即可
- 如果當前節點值大於要查找的值,那麼查找的一定在左子樹,否則在右子樹
public TreeNode searchBST(TreeNode root, int val) {
if (root == null) return null;
if (val == root.val) return root;
if (val > root.val) return searchBST(root.right, val);
else return searchBST(root.left, val);
}
複雜度分析:
時間複雜度:O(log(n)), 最壞情況下退化成鏈表,複雜度爲 O(n)
空間複雜度:O(n), 使用了遞歸,棧中存在 h 個方法調用,h 爲二分搜索樹的高度
-
2. 迭代法
思路:使用隊列進行層序遍歷
- 創建一個隊列,並將根節點添加進去
- 遍歷隊列,取出隊首元素,和我們要查找的元素進行判斷,如果相等,直接返回即可
- 如果當前節點的值大於要查找的元素,將左子樹節點添加進隊列, 反之將右子樹添加進隊列
public TreeNode searchBST2(TreeNode root, int val) {
if (root == null) return null;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
if (cur.val == val) return cur;
if (cur.left != null && cur.val > val) queue.add(cur.left);
else if (cur.right != null && cur.val < val) queue.add(cur.right);
}
return null;
}
複雜度分析:
- 時間複雜度:O(log(n)), 最壞情況下退化成鏈表,複雜度爲 O(n)
- 空間複雜度:O(log(n)),隊列所佔用的空間,最壞情況下爲O(n)
-
源碼
-
我會每天更新新的算法,並儘可能嘗試不同解法,如果發現問題請指正
- Github