【发布时间】:2021-06-10 11:43:57
【问题描述】:
我想删除叶节点,其值超出给定范围(例如 [L R])。我做了一个解决方案,我只是遍历所有节点并检查我当前叶节点的值是否在给定范围内。如果不是,那么我将删除此节点。
我的方法-
private static Node trim(Node root, int L, int R) {
if (root == null)
return null;
if (root.left == null && root.right == null) {
if (root.val < L || root.val > R)
return null;
else
return root;
}
root.left = trim(root.left, L, R);
root.right = trim(root.right, L, R);
return root;
}
但这在 o(n) 中运行,因为我正在遍历所有节点(而且我没有在任何地方使用 BST 的属性)。谁能帮我找到更好/优化的解决方案?
【问题讨论】:
-
在最坏的情况下,此算法将始终在
O(n)中运行,因为您可能必须删除 BST 的所有叶子,并且其中可能有O(n)。所以当涉及到最坏的情况时,你的算法已经是最优的了。为了在实践中获得更好的结果,您可以使用 BST 属性停止探索分支。请尝试相应地编辑此问题,您非常接近解决方案。
标签: java algorithm binary-search-tree tree-traversal