题目:
https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/
就是一个二叉搜索树,两个节点 p 和 q 找到最近公共祖先。这个树最大节点数目是 100000(虽然题目没说,但是我在美国 leetcode 里面找到了说明,而且在美国 leetcode 和这里提交,报错情况一模一样)
我的做法是先把这个树变成一个 index 为 1 对应 root 的数组vals
,左子树 index 是 2*index, 右子树是 2*index+1 。
找到 p 的 index 是 pIndex ,q 的 index 是 qIndex ,然后在 boolean 数组visited
里面把 p 的 parent 都标记为 true ,然后分析 q ,q 的第一个 visited 为 true 的地方就是最近的公共节点。
代码是这样:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) {
return null;
}
final int maxSize = 9000000;
int[] vals = new int[maxSize];
TreeNode[] nodes = new TreeNode[maxSize];
boolean[] visited = new boolean[maxSize];
var nodeStack = new ArrayDeque<TreeNode>();
var indexStack = new ArrayDeque<Integer>();
nodeStack.offerLast(root);
indexStack.offerLast(1);
int pIndex = 0, qIndex = 0;
while (nodeStack.size() != 0) {
var node = nodeStack.pollFirst();
var index = indexStack.pollFirst();
vals[index] = node.val;
nodes[index] = node;
if (node == p) {
pIndex = index;
} else if (node == q) {
qIndex = index;
}
if (node.left != null) {
nodeStack.offerLast(node.left);
indexStack.offerLast(2 * index);
}
if (node.right != null) {
nodeStack.offerLast(node.right);
indexStack.offerLast(2 * index + 1);
}
}
while (pIndex >= 1) {
visited[pIndex] = true;
pIndex /= 2;
}
TreeNode answer = null;
while (qIndex >= 1) {
if (visited[qIndex]) {
answer = nodes[qIndex];
break;
}
qIndex /= 2;
}
return answer;
}
}
报错是:
java.lang.ArrayIndexOutOfBoundsException: Index 12694084 out of bounds for length 9000000
at line 21, Solution.lowestCommonAncestor
at line 55, __DriverSolution__.__helper__
at line 102, __Driver__.main
也就是说,我在第一个 while 里面第三行 val[index] = node.val 时,index 超过了 900000.
但是我在本地测试同样的数据,没有任何问题,能给出正确答案。
从逻辑上说,这个测试数据集给出了 20000 个节点,也不可能让 index 达到报错里面所说的 12694084 。。。(很简单的逻辑。。。)
真不知道出了什么问题。。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.