由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - google电面
相关主题
Twitter电面未通过讨论一道construct BST level by level的问题
请教LEETCODE讲解部分的LCA一道题的变种。。问个二叉树删除结点的问题
谷歌 电面Quantcast悲剧面经
请教个面试题二叉树如何判断一个节点是不是在另外两个节点的path上。。。。好像是个老题了。。求解?
问个问题post order traveral using interation问个老题,find the next larger in BST
Lowest common ancestor of two nodes of Binary Treebinary tree, sum of 2 nodes == given number
twitter 面经(Update)Amazon 面经 offer
在版上看到的G题LCA复杂度是多少
相关话题的讨论汇总
话题: flag话题: parent话题: node话题: tree话题: return
进入JobHunting版参与讨论
1 (共1页)
f******6
发帖数: 723
1
给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
如何找他们的lowest common ancestor。
如果是BST(但这里不是),这是个经典的问题。
你的solution要O(lgn)time和constant space。
如果大家已经讨论过,能不能给我一个link看看?
经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
谢谢大家。
r**u
发帖数: 1567
2
when branching through the tree, the first node x, where p starts to go left
, and q starts to go right, is the LCA.

戏么?

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

q*********u
发帖数: 280
3
我自己胡乱写了一个伪代码,指正一下
findCommonParent(p, q){
if(parent(p) == parent(q))
return parent(p);
else if(parent(p) == Root || parent(q) == Root || p == Root || q ==
Root)
return Root;
else
return findCommonParent(parent(p), parent(q));
}

给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
如何找他们的lowest common ancestor。
如果是BST(但这里不是),这是个经典的问题。
你的solution要O(lgn)time和constant space。
如果大家已经讨论过,能不能给我一个link看看?
经过提示完成,中间紧张无比(原谅我比较菜),comm

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

r****o
发帖数: 1950
4
可以用两个数组分别保存到p和q的路径,然后比较。

戏么?

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

f******6
发帖数: 723
5

left
能具体说说你的算法么?你怎么判断p goes left and q starts to go right。这个
function是pass nodes p and q as parameters.

【在 r**u 的大作中提到】
: when branching through the tree, the first node x, where p starts to go left
: , and q starts to go right, is the LCA.
:
: 戏么?

f******6
发帖数: 723
6

constant space ...
这个不行

【在 r****o 的大作中提到】
: 可以用两个数组分别保存到p和q的路径,然后比较。
:
: 戏么?

r****o
发帖数: 1950
7
sorry, 没看到constant space.

【在 f******6 的大作中提到】
:
: constant space ...
: 这个不行

f******6
发帖数: 723
8

=
呵呵, 如果p在q下面,vice versa。。。这里同时用parent不行吧。
不过最后我用的recursion,为了那个constant space。。。

【在 q*********u 的大作中提到】
: 我自己胡乱写了一个伪代码,指正一下
: findCommonParent(p, q){
: if(parent(p) == parent(q))
: return parent(p);
: else if(parent(p) == Root || parent(q) == Root || p == Root || q ==
: Root)
: return Root;
: else
: return findCommonParent(parent(p), parent(q));
: }

q*********u
发帖数: 280
9
那就填两个判断 isSubNode(p, q)和isSubNode(q, p)
不过感觉这样是不是if太多了,我不知道你说的标准做法,谁能再贴一下。

=
呵呵, 如果p在q下面,vice versa。。。这里同时用parent不行吧。
不过最后我用的recursion,为了那个constant space。。。

【在 f******6 的大作中提到】
:
: =
: 呵呵, 如果p在q下面,vice versa。。。这里同时用parent不行吧。
: 不过最后我用的recursion,为了那个constant space。。。

r**u
发帖数: 1567
10
FT, I thought it's BST...

【在 f******6 的大作中提到】
:
: =
: 呵呵, 如果p在q下面,vice versa。。。这里同时用parent不行吧。
: 不过最后我用的recursion,为了那个constant space。。。

相关主题
Lowest common ancestor of two nodes of Binary Tree讨论一道construct BST level by level的问题
twitter 面经(Update)问个二叉树删除结点的问题
在版上看到的G题Quantcast悲剧面经
进入JobHunting版参与讨论
j**l
发帖数: 2911
11
实话说,我只知道在有指向parent指针的情况下的O(n)算法,其中n是树的最大高度。
先移动p或q使得p,q同层,然后同步向上移。

戏么?

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

f******6
发帖数: 723
12

我就是想到这个。呵呵,不过题目里n是tree nodes个数,所以,算lgn?

【在 j**l 的大作中提到】
: 实话说,我只知道在有指向parent指针的情况下的O(n)算法,其中n是树的最大高度。
: 先移动p或q使得p,q同层,然后同步向上移。
:
: 戏么?

j**l
发帖数: 2911
13
你这里的n是树的节点个数还是树的最大高度?

戏么?

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

j**l
发帖数: 2911
14
如果树不平衡,最坏情况下高度就是O(n)

【在 f******6 的大作中提到】
:
: 我就是想到这个。呵呵,不过题目里n是tree nodes个数,所以,算lgn?

f******6
发帖数: 723
15

对,我也认为是这样。不过interviewer没有质疑O(lgn)。。。应该没有tree is
balanced 这个假设
我现在想想,又想不通了。。。

【在 j**l 的大作中提到】
: 如果树不平衡,最坏情况下高度就是O(n)
a***9
发帖数: 364
16
int flag_p = 0, flag_q = 0;
int flag = 1;
int possible = 0;
lca (Node * n) {
if (flag_p && flag_q) return;
possible = 0;
if (!flag_p && !flag_q) possible = 1;
if (p == n) flag_p = 1;
if (q == n) flag_q = 1;
if (!flag_p || !flag_q) {
lca (n->left);
if (!flag_p || !flag_q) lca(n->right);
}
if (possible && flag && flag_p && flag_q) {
cout << "lca is " << n << endl;
flag = 0;
}
}
这样子可以么?

戏么?

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

k**********i
发帖数: 177
17
careercup有这个题目的解法吧。。。 就是讨论p q 是不是在同一个子树下, 如果是
的话就
继续往下找, 知道他们不是在同一个子树下, 说明当前的节点就是最low的公共节点
了。
node * common(node * T, node *p, node *q)
{
if (T == null)
return ;
if (covers(T->left, p)&&covers(T->left, q))
return common(T->left, p, q);
if (covers(T->right, p))&&covers(T->right, q))
return common(T->right,p,q);
return T;
}
bool covers(node *T, node * p)
{
if (T== null)
return false;
if (T == p)
return true;
return covers(T->left

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

a***9
发帖数: 364
18
这个写的很elegant,问个问题:common的复杂度是O(logn), 每次调用covers又是O(
logn)
的样子,那整体不是O(logn*logn)吗?请赐教!

【在 k**********i 的大作中提到】
: careercup有这个题目的解法吧。。。 就是讨论p q 是不是在同一个子树下, 如果是
: 的话就
: 继续往下找, 知道他们不是在同一个子树下, 说明当前的节点就是最low的公共节点
: 了。
: node * common(node * T, node *p, node *q)
: {
: if (T == null)
: return ;
: if (covers(T->left, p)&&covers(T->left, q))
: return common(T->left, p, q);

i********s
发帖数: 133
19
这个解法是递归的,空间不是常数吧。需要树高(logn)的栈。
而且时间复杂度也不是log(n)的。一种情况是p,q分别在树根的左右两边,而p需要遍历
完左边的所有节点才知道。q需要遍历所有右边节点才知道。
所以复杂度至少是遍历所有节点。

【在 k**********i 的大作中提到】
: careercup有这个题目的解法吧。。。 就是讨论p q 是不是在同一个子树下, 如果是
: 的话就
: 继续往下找, 知道他们不是在同一个子树下, 说明当前的节点就是最low的公共节点
: 了。
: node * common(node * T, node *p, node *q)
: {
: if (T == null)
: return ;
: if (covers(T->left, p)&&covers(T->left, q))
: return common(T->left, p, q);

a***9
发帖数: 364
20
这个。。对不是bst的树,根本不知道node value之间的关系,不让用递归stack,就算
循环也是要记录吧.
时间复杂度来说,看起来起码对左右分支的查找是相互独立的,这里大概可以assume可
以并行的做,要不然,没有order的树用什么策略找都有可能要O(n)吧.这段程序我主要
怀疑的是时间复杂度O(logn*logn).
当然,我不清楚,是胡说。
麻烦看一下我的ugly代码..

【在 i********s 的大作中提到】
: 这个解法是递归的,空间不是常数吧。需要树高(logn)的栈。
: 而且时间复杂度也不是log(n)的。一种情况是p,q分别在树根的左右两边,而p需要遍历
: 完左边的所有节点才知道。q需要遍历所有右边节点才知道。
: 所以复杂度至少是遍历所有节点。

相关主题
二叉树如何判断一个节点是不是在另外两个节点的path上。。。。好像是个老题了。。求解?Amazon 面经 offer
问个老题,find the next larger in BSTLCA复杂度是多少
binary tree, sum of 2 nodes == given numberBST 节点的下一个数
进入JobHunting版参与讨论
k**********i
发帖数: 177
21
恩 我好像看错题目了 是bst的解法 可以知道node value之间的关系。。

【在 a***9 的大作中提到】
: 这个。。对不是bst的树,根本不知道node value之间的关系,不让用递归stack,就算
: 循环也是要记录吧.
: 时间复杂度来说,看起来起码对左右分支的查找是相互独立的,这里大概可以assume可
: 以并行的做,要不然,没有order的树用什么策略找都有可能要O(n)吧.这段程序我主要
: 怀疑的是时间复杂度O(logn*logn).
: 当然,我不清楚,是胡说。
: 麻烦看一下我的ugly代码..

a***9
发帖数: 364
22
不会啊,我觉得你的程序是对的,只不过复杂度我有点疑惑

【在 k**********i 的大作中提到】
: 恩 我好像看错题目了 是bst的解法 可以知道node value之间的关系。。
i********s
发帖数: 133
23
如果知道父节点指针,用上面提到的方法,是可以在常数空间和logn时间内解决的。

【在 a***9 的大作中提到】
: 这个。。对不是bst的树,根本不知道node value之间的关系,不让用递归stack,就算
: 循环也是要记录吧.
: 时间复杂度来说,看起来起码对左右分支的查找是相互独立的,这里大概可以assume可
: 以并行的做,要不然,没有order的树用什么策略找都有可能要O(n)吧.这段程序我主要
: 怀疑的是时间复杂度O(logn*logn).
: 当然,我不清楚,是胡说。
: 麻烦看一下我的ugly代码..

i********s
发帖数: 133
24
如果知道父节点指针,用上面提到的方法,是可以在常数空间和logn时间内解决的。

【在 a***9 的大作中提到】
: 这个。。对不是bst的树,根本不知道node value之间的关系,不让用递归stack,就算
: 循环也是要记录吧.
: 时间复杂度来说,看起来起码对左右分支的查找是相互独立的,这里大概可以assume可
: 以并行的做,要不然,没有order的树用什么策略找都有可能要O(n)吧.这段程序我主要
: 怀疑的是时间复杂度O(logn*logn).
: 当然,我不清楚,是胡说。
: 麻烦看一下我的ugly代码..

a***9
发帖数: 364
25
en, make sense
脑筋急转弯啊 还要猜条件..换作我肯定挂了

【在 i********s 的大作中提到】
: 如果知道父节点指针,用上面提到的方法,是可以在常数空间和logn时间内解决的。
c********t
发帖数: 1756
26
这题要用等价的 range-min queries 解。
k**********i
发帖数: 177
27
恩 我发现了 程序没问题 只要是binary tree 就可以的 不一定是bst。。。复杂度我
也没看出
来, 我觉得好像最坏的话 应该是logn*logn了

【在 a***9 的大作中提到】
: 不会啊,我觉得你的程序是对的,只不过复杂度我有点疑惑
y**i
发帖数: 1112
28
我怎么感觉这个就跟两个链表有公共结点,找公共结点的题目一样啊
首先确定p和q的层数(对应链表的长度),然后先移动层数多的那个结点向上(父结点
)到和另一个结点同样的层数,然后同时向上移动,找相同的结点指针。
复杂度O(lgn)。
这两个算同一个类型的题目么?

戏么?

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

s***l
发帖数: 129
29
确定层数需要O(n)吧,如果没有父节点的话

【在 y**i 的大作中提到】
: 我怎么感觉这个就跟两个链表有公共结点,找公共结点的题目一样啊
: 首先确定p和q的层数(对应链表的长度),然后先移动层数多的那个结点向上(父结点
: )到和另一个结点同样的层数,然后同时向上移动,找相同的结点指针。
: 复杂度O(lgn)。
: 这两个算同一个类型的题目么?
:
: 戏么?

f******6
发帖数: 723
30

能不能说的清楚点,为什么有了parent pointer,确定level就是
O(lgn)。谢谢
楼上的,思路就是这个,就是要有parent pointer。

【在 s***l 的大作中提到】
: 确定层数需要O(n)吧,如果没有父节点的话
相关主题
LCA复杂度请教LEETCODE讲解部分的LCA一道题的变种。。
Facebook第一轮电面面经谷歌 电面
Twitter电面未通过请教个面试题
进入JobHunting版参与讨论
r****o
发帖数: 1950
31
是不是他的程序里面默认树里面存在p和q啊。
这道题要不要判断树里面不存在p或q的情况?

【在 a***9 的大作中提到】
: 不会啊,我觉得你的程序是对的,只不过复杂度我有点疑惑
f******6
发帖数: 723
32

我的意思是说,如果是个极端不balanced binary tree(比如只有一个left node,然
后剩余的n-2 nodes全在right tree),就算有parent pointer,确定level也是O(n)..
.请指教一下。。。

【在 f******6 的大作中提到】
:
: 能不能说的清楚点,为什么有了parent pointer,确定level就是
: O(lgn)。谢谢
: 楼上的,思路就是这个,就是要有parent pointer。

a***9
发帖数: 364
33
en, I think it's for average case. For trees like what you said,
it's O(n) anyway.

..

【在 f******6 的大作中提到】
:
: 我的意思是说,如果是个极端不balanced binary tree(比如只有一个left node,然
: 后剩余的n-2 nodes全在right tree),就算有parent pointer,确定level也是O(n)..
: .请指教一下。。。

s***l
发帖数: 129
34
preprocess的话,RMQ可以保证O(nlgn).

..

【在 f******6 的大作中提到】
:
: 我的意思是说,如果是个极端不balanced binary tree(比如只有一个left node,然
: 后剩余的n-2 nodes全在right tree),就算有parent pointer,确定level也是O(n)..
: .请指教一下。。。

a***9
发帖数: 364
35
In the case we don't have parent pointer, you can handle that situation if you want,
it's a tiny bug he return the root node for this case.
Anyone comment on my code? If I write code like that to recruiter,
will he definitely turn me down?

【在 r****o 的大作中提到】
: 是不是他的程序里面默认树里面存在p和q啊。
: 这道题要不要判断树里面不存在p或q的情况?

g**********1
发帖数: 1113
36
If the link does not has the pointer to the parent, how can you get the
parent? You need start from beginning to find the parent...waste a lot of
time. You only need 100 bits store the path and it can handle all possible
binary tree in the real world.
a***o
发帖数: 19
37
You can achieve O(n) space and O(lg(N)) time complexity if you have parent
node pointer stored in each node.
This is achieved by first building d 2 linked list to store paths from root
to each node, and then comparing the linked list to find the last common
node in both list.
You can get a better understanding on LCA problem from this TopCoder
tutorial (see link below). It gives two solutions to this problem.
http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor
The idea
w*****e
发帖数: 197
38
你为什么不给出答案呢?
我把提示给出来吧:需要计算两个节点的深度差,然后。。。

戏么?

【在 f******6 的大作中提到】
: 给你一个tree(任何tree,但是你可以assume binary tree),给你两个nodes,p和q,
: 如何找他们的lowest common ancestor。
: 如果是BST(但这里不是),这是个经典的问题。
: 你的solution要O(lgn)time和constant space。
: 如果大家已经讨论过,能不能给我一个link看看?
: 经过提示完成,中间紧张无比(原谅我比较菜),communication不是很好,这样有戏么?
: 谢谢大家。

x****r
发帖数: 99
39
上面贴的careercup的解法应该不行吧,空间和时间复杂度都远远不符合要求。。这样
的要求,肯定得知道parent pointer, 不然找一个node就要O(n),怎么可能logN找到
LCA呢。。
1 (共1页)
进入JobHunting版参与讨论
相关主题
LCA复杂度是多少问个问题post order traveral using interation
BST 节点的下一个数Lowest common ancestor of two nodes of Binary Tree
LCA复杂度twitter 面经(Update)
Facebook第一轮电面面经在版上看到的G题
Twitter电面未通过讨论一道construct BST level by level的问题
请教LEETCODE讲解部分的LCA一道题的变种。。问个二叉树删除结点的问题
谷歌 电面Quantcast悲剧面经
请教个面试题二叉树如何判断一个节点是不是在另外两个节点的path上。。。。好像是个老题了。。求解?
相关话题的讨论汇总
话题: flag话题: parent话题: node话题: tree话题: return