加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

669.Trim a Binary Search Tree

发布时间:2020-12-14 04:15:29 所属栏目:大数据 来源:网络整理
导读:Given a binary search tree and the lowest and highest boundaries as?L?and?R,trim the tree so that all its elements lies in?[L,R]?(R = L). You might need to change the root of the tree,so the result should return the new root of the trimmed
Given a binary search tree and the lowest and highest boundaries as?L?and?R,trim the tree so that all its elements lies in?[L,R]?(R >= L). You might need to change the root of the tree,so the result should return the new root of the trimmed binary search tree.
Example 1:?
Input: 
    1
   /   0   2

  L = 1
  R = 2

Output: 
    1
             2

Example 2:?
Input: 
    3
   /   0   4
       2
   /
  1

  L = 1
  R = 3

Output: 
      3
     / 
   2   
  /
 1



class Solution {
    public TreeNode trimBST(TreeNode root,int L,int R) {
        if (root == null) return null;
        
        if (root.val < L) return trimBST(root.right,L,R);
        if (root.val > R) return trimBST(root.left,R);
        
        root.left = trimBST(root.left,R);
        root.right = trimBST(root.right,R);
        
        return root;
    }
}



I just found everyone using recursion to solve this problem. And it‘s true that recursive solution is much clean and readable. But I just want to write a iterative version which is much longer. Using three loops,one for finding a new root. Second for removing the invalid nodes from left subtree of new root. The last one for removing the invalids nodes from right subtree of new root. Have fun with this solution. lol

class Solution {
    public TreeNode trimBST(TreeNode root,int R) {
        if (root == null) {
            return root;
        }
        //Find a valid root which is used to return.
        while (root.val < L || root.val > R) {
            if (root.val < L) {
                root = root.right;
            }
            if (root.val > R) {
                root = root.left;
            }
        }
        TreeNode dummy = root;
        // Remove the invalid nodes from left subtree.
        while (dummy != null) {
            while (dummy.left != null && dummy.left.val < L) {
                dummy.left = dummy.left.right; 
                // If the left child is smaller than L,then we just keep the right subtree of it. 
            }
            dummy = dummy.left;
        }
        dummy = root;
        // Remove the invalid nodes from right subtree
        while (dummy != null) {
            while (dummy.right != null && dummy.right.val > R) {
                dummy.right = dummy.right.left;
                // If the right child is biggrt than R,then we just keep the left subtree of it. 
            }
            dummy = dummy.right;
        }
        return root;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读