LeetCode 669. 修剪二叉搜索樹

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. 遞歸法

思路:

  1. 判斷當前根節點的值和區間的左右邊界
  2. 如果根節點的值都大於區間的右邊界,那麼右子樹的值一定都大於右區間,我們只需修剪左子樹即可, 反之同理
  3. 如果當前根節點在區間內,分別修剪左右子樹即可
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章