题目
669.
修剪二叉搜索树
给你二叉搜索树的根节点 root
,同时给定最小边界low
和最大边界
high
。通过修剪二叉搜索树,使得所有节点的值在[low, high]
中。修剪树
不应该 改变保留在树中的元素的相对结构
(即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在
唯一的答案 。
所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
示例 1: >
> > 输入:root = [1,0,2], low = 1, high = 2
> 输出:[1,null,2]
示例 2: >
> > 输入:root = [3,0,4,null,2,null,null,1], low = 1, high =
3
> 输出:[3,2,null,1]
提示:
- 树中节点数在范围
[1, 10^{4}]
内
0 <= Node.val <= 10^{4}
- 树中每个节点的值都是 唯一 的
- 题目数据保证输入是一棵有效的二叉搜索树
0 <= low <= high <= 10^{4}
标签
树, 深度优先搜索, 二叉搜索树, 二叉树
题解
【修剪二叉搜索树】简单二叉树遍历
递归模拟
不难发现,我们只需要遍历二叉树把不符合要求的结点删掉即可,有两种情况需要删除:
- 根节点比
left
小,由二叉搜索树的性质以及小于的传递性可知,左子树的值都小于根节点也小于
left
,
所以这种情况应该用右子树替代左子树再对右子树进行修剪
- 根节点比
right
大,同理可得,应该用修剪后的左子树替代原先的根节点
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution: def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]: if not root: return None if root.val < low: return self.trimBST(root.right, low, high) elif root.val > high: return self.trimBST(root.left, low, high) else: root.left = self.trimBST(root.left, low, high) root.right = self.trimBST(root.right, low, high) return root
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public TreeNode trimBST(TreeNode root, int low, int high) { if (root == null) return null; if (root.val < low) return trimBST(root.right, low, high); else if (root.val > high) return trimBST(root.left, low, high); else { root.left = trimBST(root.left, low, high); root.right = trimBST(root.right, low, high); } return root; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public: TreeNode* trimBST(TreeNode* root, int low, int high) { if (root == nullptr) return nullptr; if (root->val < low) return trimBST(root->right, low, high); else if (root->val > high) return trimBST(root->left, low, high); else { root->left = trimBST(root->left, low, high); root->right = trimBST(root->right, low, high); } return root; } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
var trimBST = function(root, low, high) { if (root == null) return null; if (root.val < low) return trimBST(root.right, low, high); else if (root.val > high) return trimBST(root.left, low, high); else { root.left = trimBST(root.left, low, high); root.right = trimBST(root.right, low, high); } return root; };
|
- 时间复杂度: \(O(n)\)
- 空间复杂度: \(O(1)\)
如果对你有帮助的话,请给我点个赞吧~
欢迎前往 我的博客
或 Algorithm -
Github 查看更多题解