669. 修剪二叉搜索樹
給定一個二叉搜索樹,同時給定最小邊界L 和最大邊界 R。通過修剪二叉搜索樹,使得所有節點的值在[L, R]中 (R>=L) 。你可能需要改變樹的根節點,所以結果應當返回修剪好的二叉搜索樹的新的根節點。
示例1:
輸入:
1
/ \
0 2
L = 1
R = 2
輸出:
1
\
2
示例2:
輸入:
3
/ \
0 4
\
2
/
1
L = 1
R = 3
輸出:
3
/
2
/
1
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
-
創建二叉搜索樹
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
-
1. 遞歸法
思路:
- 判斷當前根節點的值和區間的左右邊界
- 如果根節點的值都大於區間的右邊界,那麼右子樹的值一定都大於右區間,我們只需修剪左子樹即可, 反之同理
- 如果當前根節點在區間內,分別修剪左右子樹即可
public TreeNode trimBST(TreeNode root, int L, int R) {
if (root == null) return null;
//如果根節點的值都大於區間的右邊界,那麼右子樹的值一定都大於右區間,我們只需修剪左子樹即可
if (root.val > R) {
return trimBST(root.left, L, R);
}
//同理
if (root.val < L) {
return trimBST(root.right, L, R);
}
root.left = trimBST(root.left, L, R);
root.right = trimBST(root.right, L, R);
return root;
}
複雜度分析:
- 時間複雜度:O(n), 最壞情況下每個節點都需要訪問一次
- 空間複雜度:O(n), 在最糟糕的情況下,我們遞歸調用的棧可能與節點數一樣大。
-
源碼
-
我會每天更新新的算法,並儘可能嘗試不同解法,如果發現問題請指正
- Github