我想检查提供给我的二进制搜索树是否平衡。
由于树已经存在于内存中,因此在遍历节点时检查树是否平衡时不需要额外的存储空间。
所以我假设空间复杂度为O(1)。
这是对的吗?
// Definition for binary tree
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null)
return true;
if (getHeight(root) == -1)
return false;
return true;
}
public int getHeight(TreeNode root) {
if (root == null)
return 0;
int left = getHeight(root.left);
int right = getHeight(root.right);
if (left == -1 || right == -1)
return -1;
if (Math.abs(left - right) > 1) {
return -1;
}
return Math.max(left, right) + 1;
}
}
答案 0 :(得分:0)
你的算法是O(height)
空间,而不是O(1)
- 当你递归树时,你需要在内存中为每个节点存储1个递归函数调用,你永远不会超过{{1在树中(在返回之前,可以摆脱已经完全处理的节点)。
对于像这样的树:
<子>(Image reference - Wikipedia)子>
你的电话会是这样的:
O(height)
此处getHeight(8)
getHeight(3)
getHeight(1)
getHeight(6)
getHeight(4)
getHeight(7)
getHeight(10)
getHeight(14)
getHeight(13)
调用getHeight(8)
,调用getHeight(3)
和getHeight(1)
等。
在我们调完getHeight(6)
的功能后(将结果返回到1
的调用),我们不再需要将其保留在内存中,因此我们在内存中保留的最大调用次数等于树的高度。
可以在3
空间内完成,但它相当复杂且非常慢(比解决方案所需的O(1)
慢得多。)
关键是我们有一个二叉搜索树,因此,给定一个节点,我们知道该节点是否在任何祖先节点的左子树或右子树中,我们可以用它来确定父节点的父节点。节点。
我可能会在某个时候创建一个单独的Q&amp; A进入更多细节。