【LeetCode】700. 二叉搜尋樹中的搜尋
阿新 • • 發佈:2021-08-03
700. 二叉搜尋樹中的搜尋
知識點:二叉樹;遞迴
題目描述
給定二叉搜尋樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。
示例
給定二叉搜尋樹:
4
/ \
2 7
/ \
1 3
和值: 2
返回:
2
/ \
1 3
在上述示例中,如果要找的值是
5,但因為沒有節點值為 5,我們應該返回 NULL。
解法一:遞迴
二叉搜尋樹
首先應該明白二叉搜尋樹的含義:任意一棵樹的節點都大於左子樹,並且小於右子樹;
尤其是二叉搜尋樹的根節點不僅大於左節點,是大於左子樹,也就是上左樹上的任意一個節點,右節點同理。並且樹中的任意一個節點都是二叉搜尋樹;
一個很重要的性質:二叉搜尋樹按中序遍歷完之後是一個遞增序列;
函式功能:找到和值相等的節點
1.終止條件:root==null,則返回null。
2.該做什麼:拿到值後判斷值是否和自己一樣,如果一樣就返回,如果不一樣,則分別看值和節點誰大然後分別去左樹和右樹上繼續找。
3.先判斷根節點才能知道往哪個樹上去,前序。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode searchBST(TreeNode root, int val) { if(root == null) return null; if(root.val == val) return root; else if(root.val > val) return searchBST(root.left, val); else return searchBST(root.right, val); } }
空間複雜度:O(N):堆疊的支出
解法二:迭代
直接根據值去左樹和右樹上去找,直到找到或者走到頭為止,可以減少空間複雜度。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode searchBST(TreeNode root, int val) { if(root == null) return root; TreeNode cur = root; while(cur != null){ if(cur.val == val) return cur; else if(cur.val > val) cur = cur.left; else cur = cur.right; } return null; } }
體會
要熟練掌握二叉搜尋樹的遞迴,往往會用到當前值和給定元素的大小關係,因為二叉搜尋樹是有嚴格大小關係的,根據比較的結果去左樹或者右樹。
其次要掌握二叉搜尋樹的關鍵性質:其中序遍歷是遞增數列;