由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问两道facebook面试题
相关主题
问个google面试题问一道google面经
请教这么一个题:BST maximum sum path这个check whether a binary tree is a BST or not
BST 找重复节点数判断 bst 疑问
关于inordertraversal 的iterative way借人气问一道Samsung的题
least common ancestor的疑惑为啥有两个case不对??Binary Tree Maximum Path Sum
插入节点到complete binary tree的末尾贴个自己的答案:Binary Tree Max Path Sum
recovery BST 不考虑相同值的情况么?F家面经
Amazon 打印给定node距离最近的K个nodes微软面试的一道题
相关话题的讨论汇总
话题: int话题: node话题: root话题: path话题: null
进入JobHunting版参与讨论
1 (共1页)
l**********1
发帖数: 415
1
向大牛们求教:
1)N*N期盼,从(x,Y)到(0,0)的所有路径,只能向左或下走。貌似career-cup上只
有求一条路的。那位牛人给个所有路径的code?
2)一个二叉树,每个节点都是正或负整数,如何找到一个subtree whose sum is the
max.
谢谢!
d****o
发帖数: 1055
2
第一题:
总的路径数是C(X+Y,X)
比如
X=3 Y=4
用0表示向左,1表示向下。下面就表示了一个路径
1110000
下面我们做的就是找出所有的combination
比如
输出 0 1 2就是表示1110000
输出 0 2 3表示 1011000
//XY中选X个
void combinationXY(int out[],int XYLen, int XLen,int lev,int start)
{
if(lev==XLen)
{
for(int i=0;i cout< cout< return;
}
for(int i=start;i {
out[lev]=i;
combinationXY(out,XYLen,XLen,lev+1,i+1);
}
}

the

【在 l**********1 的大作中提到】
: 向大牛们求教:
: 1)N*N期盼,从(x,Y)到(0,0)的所有路径,只能向左或下走。貌似career-cup上只
: 有求一条路的。那位牛人给个所有路径的code?
: 2)一个二叉树,每个节点都是正或负整数,如何找到一个subtree whose sum is the
: max.
: 谢谢!

d****o
发帖数: 1055
3
第2题:
不知道对不对?
int maxSubTree(node* root,node** maxRoot, int& maxNum)
{
if(root==NULL) return 0;
else
{
int sum = root->data+maxSubTree(root->left)+maxSubTree(root->right);
if(sum>maxNum)
{
maxNum=sum;
(*maxRoot) = root;
}
return sum;
}
}
node* maxSub(node* root)
{
assert(root);
node* p = NULL;
int maxNum = root->data;
maxSubTree(root,&p,maxNum);
return p;
}

the

【在 l**********1 的大作中提到】
: 向大牛们求教:
: 1)N*N期盼,从(x,Y)到(0,0)的所有路径,只能向左或下走。貌似career-cup上只
: 有求一条路的。那位牛人给个所有路径的code?
: 2)一个二叉树,每个节点都是正或负整数,如何找到一个subtree whose sum is the
: max.
: 谢谢!

r**********1
发帖数: 292
q****x
发帖数: 7404
5

相当于在(x+y)个位置里选x个左。经典组合题。
the
递归。

【在 l**********1 的大作中提到】
: 向大牛们求教:
: 1)N*N期盼,从(x,Y)到(0,0)的所有路径,只能向左或下走。貌似career-cup上只
: 有求一条路的。那位牛人给个所有路径的code?
: 2)一个二叉树,每个节点都是正或负整数,如何找到一个subtree whose sum is the
: max.
: 谢谢!

p*****2
发帖数: 21240
6
第二题
int maxSum=int.MinValue;
Node maxTree=null;
int Find(Node* node)
{
if(node==null)
return 0;
int l=Find(node.left);
int r=Find(node.right);
int sum=l+r+node.value;
if(sum>maxSum)
{
maxTree=node;
maxSum=sum;
}
return sum;
}
q****x
发帖数: 7404
7
good

【在 p*****2 的大作中提到】
: 第二题
: int maxSum=int.MinValue;
: Node maxTree=null;
: int Find(Node* node)
: {
: if(node==null)
: return 0;
: int l=Find(node.left);
: int r=Find(node.right);
: int sum=l+r+node.value;

p*****2
发帖数: 21240
8

是不是罗嗦点?

【在 r**********1 的大作中提到】
: 第二题:
: http://puddleofriddles.blogspot.com/2012/01/write-program-to-fi
: 包子啊。

r**********1
发帖数: 292
9
int maxSum(struct node* root, int* max)
{
if(root == NULL)
return 0;
if((root->left == NULL) && (root->right == NULL))
{
if(root->data > *max)
*max = root->data;
return root->data;
}
int sum = maxSum(root->left, max) + maxSum(root->right, max) + root->data;
if(sum > *max)
*max = sum;
return sum;
}
你是觉得哪里罗嗦了? 我感觉和前面一个写的差不多啊。

【在 p*****2 的大作中提到】
:
: 是不是罗嗦点?

p*****2
发帖数: 21240
10
第一题这样可以吗?
public class Game
{
private void FindPath(int total, int x, int level, List path)
{
if (path.Count == x)
{
foreach (int i in path)
Console.Write("{0} ", i);
Console.WriteLine();
return;
}
for (int i = level; i < total; i++)
{
path.Add(i);
FindPath(total, x,i + 1, path);
path.RemoveAt(path.Count - 1);
}
}
public void AllPaths(int x, int y)
{
List path = new List();
FindPath(x+y, x, 0, path);
}
}
相关主题
插入节点到complete binary tree的末尾问一道google面经
recovery BST 不考虑相同值的情况么?这个check whether a binary tree is a BST or not
Amazon 打印给定node距离最近的K个nodes判断 bst 疑问
进入JobHunting版参与讨论
p*****2
发帖数: 21240
11
这段有必要吗?
if((root->left == NULL) && (root->right == NULL))
{
if(root->data > *max)
*max = root->data;
return root->data;
}

【在 r**********1 的大作中提到】
: int maxSum(struct node* root, int* max)
: {
: if(root == NULL)
: return 0;
: if((root->left == NULL) && (root->right == NULL))
: {
: if(root->data > *max)
: *max = root->data;
: return root->data;
: }

r**********1
发帖数: 292
12
yeah, 你是对的。

【在 p*****2 的大作中提到】
: 这段有必要吗?
: if((root->left == NULL) && (root->right == NULL))
: {
: if(root->data > *max)
: *max = root->data;
: return root->data;
: }

b****y
发帖数: 257
13
That answer is wrong,
it should be
int left = maxSum(root->left, max);
int right = maxSum(root->right, max);
int sum = left + right + root->data;
int localMax = max(sum, max(left,right));
if(sum > *max)
*max = sum;
return max;

【在 r**********1 的大作中提到】
: 第二题:
: http://puddleofriddles.blogspot.com/2012/01/write-program-to-fi
: 包子啊。

j*****j
发帖数: 201
14
第一题,如果假设矩阵中有若干不能通过的点,怎么列出所有路径?

【在 d****o 的大作中提到】
: 第一题:
: 总的路径数是C(X+Y,X)
: 比如
: X=3 Y=4
: 用0表示向左,1表示向下。下面就表示了一个路径
: 1110000
: 下面我们做的就是找出所有的combination
: 比如
: 输出 0 1 2就是表示1110000
: 输出 0 2 3表示 1011000

e****r
发帖数: 581
15
search with backtracking, remember what you have been through

【在 j*****j 的大作中提到】
: 第一题,如果假设矩阵中有若干不能通过的点,怎么列出所有路径?
l*****a
发帖数: 14598
16
what language are you using now?
the combination of C and C#?

【在 p*****2 的大作中提到】
: 第二题
: int maxSum=int.MinValue;
: Node maxTree=null;
: int Find(Node* node)
: {
: if(node==null)
: return 0;
: int l=Find(node.left);
: int r=Find(node.right);
: int sum=l+r+node.value;

m*******l
发帖数: 12782
17
还好,你没有说smalltalk

【在 l*****a 的大作中提到】
: what language are you using now?
: the combination of C and C#?

l*****a
发帖数: 14598
18
what will happen if there is only one node and the value is negative number?

【在 p*****2 的大作中提到】
: 第二题
: int maxSum=int.MinValue;
: Node maxTree=null;
: int Find(Node* node)
: {
: if(node==null)
: return 0;
: int l=Find(node.left);
: int r=Find(node.right);
: int sum=l+r+node.value;

p*****2
发帖数: 21240
19

for interview, use C# now。feel much better than C, but it took me 2 months
to transition.

【在 l*****a 的大作中提到】
: what language are you using now?
: the combination of C and C#?

p*****2
发帖数: 21240
20

number?
好像没问题吧?

【在 l*****a 的大作中提到】
: what will happen if there is only one node and the value is negative number?
相关主题
借人气问一道Samsung的题F家面经
为啥有两个case不对??Binary Tree Maximum Path Sum微软面试的一道题
贴个自己的答案:Binary Tree Max Path SumA家,link all node in the same lev
进入JobHunting版参与讨论
l*****a
发帖数: 14598
21
不work
why 包子

【在 r**********1 的大作中提到】
: 第二题:
: http://puddleofriddles.blogspot.com/2012/01/write-program-to-fi
: 包子啊。

l*****a
发帖数: 14598
22
i mean "node *" in your code

months

【在 p*****2 的大作中提到】
:
: number?
: 好像没问题吧?

p*****2
发帖数: 21240
23

typo. 现在有的时候还是有C的习惯。sigh。面试时候有时也会这样。

【在 l*****a 的大作中提到】
: i mean "node *" in your code
:
: months

l*****a
发帖数: 14598
24
u tried that?
真的没问题?
what is maxnode and maxnum with your code?

【在 p*****2 的大作中提到】
:
: typo. 现在有的时候还是有C的习惯。sigh。面试时候有时也会这样。

p*****2
发帖数: 21240
25

没问题呀。输出都是-5.
using System;
using System.Text;
using System.Collections.Generic;
public class Node
{
public int value;
public Node left;
public Node right;
public Node(int v, Node l, Node r)
{
value = v;
left = l;
right = r;
}
}
public class MaxSum
{
public int maxSum = int.MinValue;
public Node maxTree = null;
public int Find(Node node)
{
if(node==null)
return 0;
int l=Find(node.left);
int r=Find(node.right);
int sum=l+r+node.value;
if(sum>maxSum)
{
maxTree=node;
maxSum=sum;
}
return sum;
}
}
public class Test
{
static void Main(string[] args)
{
MaxSum test = new MaxSum();
Node node = new Node(-5, null, null);
test.Find(node);
Console.WriteLine(test.maxSum);
Console.WriteLine(test.maxTree.value);
Console.In.ReadLine();
}
}

【在 l*****a 的大作中提到】
: u tried that?
: 真的没问题?
: what is maxnode and maxnum with your code?

l*****a
发帖数: 14598
26
-5 works
how about one node with int.MinValue

【在 p*****2 的大作中提到】
:
: 没问题呀。输出都是-5.
: using System;
: using System.Text;
: using System.Collections.Generic;
: public class Node
: {
: public int value;
: public Node left;
: public Node right;

m*********e
发帖数: 13
27
Q1: left = 0, down = 1
#include
#include
using namespace std;
void pathes(int x, int y, string s){
if( x == 0 && y == 0){
cout< return;
}
if(x > 0){
pathes(x-1, y, s+"0");
}
if(y > 0){
pathes(x, y-1, s+"1");
}
};
int main(int argc, char **argv){
pathes(3, 2, "");
}
If some points are not allowed, check it before move left or down.
p*****2
发帖数: 21240
28

good catch. overflow的问题也没有考虑。

【在 l*****a 的大作中提到】
: -5 works
: how about one node with int.MinValue

p*****2
发帖数: 21240
29

这样的话。上边那个答案也有问题吧?上来把root.value给了maxvalue。

【在 l*****a 的大作中提到】
: -5 works
: how about one node with int.MinValue

d****o
发帖数: 1055
30
赞,这个recursion

【在 m*********e 的大作中提到】
: Q1: left = 0, down = 1
: #include
: #include
: using namespace std;
: void pathes(int x, int y, string s){
: if( x == 0 && y == 0){
: cout<: return;
: }
: if(x > 0){

相关主题
find treenode with two indegrees请教这么一个题:BST maximum sum path
Twitter电面未通过BST 找重复节点数
问个google面试题关于inordertraversal 的iterative way
进入JobHunting版参与讨论
H***e
发帖数: 476
31
第一题,
只需要加入一个path参数,每次保持处理一个新的点,push进去path,然后处理完再pop
出来就可以了。
java code如下:
import java.util.Stack;
public class PrintAllPathInMatrix {
private int[][] data;
public PrintAllPathInMatrix(int[][] data) {
this.data = data;
}
public void emumeratePath(int i, int j, Stack path) {
if (i > data.length - 1) {
return;
}
if (j > data[0].length - 1) {
return;
}
path.add(data[i][j]);
//found a path
if (i == data.length - 1 && j == data[0].length - 1) {
for (int p = 0; p < path.size(); p++) {
System.out.print(path.get(p) + "");
}
System.out.print("\n");
}

emumeratePath(i + 1, j, path);
emumeratePath(i, j + 1, path);
path.pop();
}
public void emumeratePath() {
if(data==null || data.length==0){
return;
}
Stack path = new Stack();
emumeratePath(0, 0, path);
}
public static void main(String[] args) {
int[][] data = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
PrintAllPathInMatrix printAllPathInMatrix = new PrintAllPathInMatrix(
data);
printAllPathInMatrix.emumeratePath();
}
}

the

【在 l**********1 的大作中提到】
: 向大牛们求教:
: 1)N*N期盼,从(x,Y)到(0,0)的所有路径,只能向左或下走。貌似career-cup上只
: 有求一条路的。那位牛人给个所有路径的code?
: 2)一个二叉树,每个节点都是正或负整数,如何找到一个subtree whose sum is the
: max.
: 谢谢!

H***e
发帖数: 476
32
第二题,
用往上面反值的方法, 左右子树传值给parent node. 总复杂度为O(n).
inside a class:
BSTNode maxsumNode = null;
int maxValue = Integer.MIN_VALUE;
public void findMaxSumSubtree(BSTNode node, MutableInt sum) {
// base cases:
if (node == null) {
sum.setValue(0);
return;
}
// normal cases:
MutableInt leftSum = new MutableInt();
MutableInt rightSum = new MutableInt();
findMaxSumSubtree(node.left, leftSum);
findMaxSumSubtree(node.right, rightSum);
sum.setValue(leftSum.getValue() + rightSum.getValue() + node.key);
if (sum.getValue() > maxValue) {
maxValue = sum.getValue();
maxsumNode = node;
}
}
public BSTNode findMaxSumSubtree() {
MutableInt sum = new MutableInt();
findMaxSumSubtree(root, sum);
return maxsumNode;
}

the

【在 l**********1 的大作中提到】
: 向大牛们求教:
: 1)N*N期盼,从(x,Y)到(0,0)的所有路径,只能向左或下走。貌似career-cup上只
: 有求一条路的。那位牛人给个所有路径的code?
: 2)一个二叉树,每个节点都是正或负整数,如何找到一个subtree whose sum is the
: max.
: 谢谢!

g***y
发帖数: 764
33
ur codes do not work for a tree like this:
1
/ \
-50 -30
/ \
100 20

【在 p*****2 的大作中提到】
: 第二题
: int maxSum=int.MinValue;
: Node maxTree=null;
: int Find(Node* node)
: {
: if(node==null)
: return 0;
: int l=Find(node.left);
: int r=Find(node.right);
: int sum=l+r+node.value;

p*****2
发帖数: 21240
34
我试了一下,返回100呀。这个值不对吗?

【在 g***y 的大作中提到】
: ur codes do not work for a tree like this:
: 1
: / \
: -50 -30
: / \
: 100 20

a********n
发帖数: 1287
35
#include
using namespace std;
// 0 means right, 1 means down
void AllPath(int N, int row, int col, int path[], int idx) {
if(row==N-1 && col==N-1) {
for(int i=0; i<2*N-2; i++) {
cout << path[i] << " ";
}
cout << endl;
}
// go down
if(row != N-1) {
path[idx] = 1;
AllPath(N, row+1, col, path, idx+1);
}
// go right
if(col != N-1) {
path[idx] = 0;
AllPath(N, row, col+1, path, idx+1);
}
}
int main() {
int path[4];
AllPath(3, 0, 0, path, 0);
}
H***e
发帖数: 476
36
对的

【在 p*****2 的大作中提到】
: 我试了一下,返回100呀。这个值不对吗?
g***y
发帖数: 764
37
你对了 我看错了 我以为你的结果是find的return value。
my codes (C#):
public static int getMaxSum(Node root)
{
if (root == null)
return 0;
int max = 0;
getMaxSumHelper(root, ref max);
return max;
}
private static int getMaxSumHelper(Node root, ref int currMax
)
{
int leftSum = 0;
int rightSum = 0;
if (root.left != null)
{
leftSum = getMaxSumHelper(root.left, ref currMax);
}
if (root.right != null)
{
rightSum = getMaxSumHelper(root.right, ref currMax);
}
if (rightSum + leftSum + root.payLoad > currMax)
{
currMax = rightSum + leftSum + root.payLoad;
}
return rightSum + leftSum + root.payLoad;

}

【在 p*****2 的大作中提到】
: 我试了一下,返回100呀。这个值不对吗?
p*****2
发帖数: 21240
38
嗯。我没有好好写。用了两个全局变量。

【在 g***y 的大作中提到】
: 你对了 我看错了 我以为你的结果是find的return value。
: my codes (C#):
: public static int getMaxSum(Node root)
: {
: if (root == null)
: return 0;
: int max = 0;
: getMaxSumHelper(root, ref max);
: return max;
: }

H***e
发帖数: 476
39
喝喝,如果我需要全局变量来比较clean得话,我一般把他们wrap到一个 class里面。。

【在 p*****2 的大作中提到】
: 嗯。我没有好好写。用了两个全局变量。
p*****2
发帖数: 21240
40

。。
我在VS上是这么搞的。我当时就是在纸上写了一下就发上来了。只是表达一个算法。

【在 H***e 的大作中提到】
: 喝喝,如果我需要全局变量来比较clean得话,我一般把他们wrap到一个 class里面。。
相关主题
关于inordertraversal 的iterative wayrecovery BST 不考虑相同值的情况么?
least common ancestor的疑惑Amazon 打印给定node距离最近的K个nodes
插入节点到complete binary tree的末尾问一道google面经
进入JobHunting版参与讨论
r**********1
发帖数: 292
41
没有错。
你的这个比较,在原函数的recursive calls里面就比较过了。

【在 b****y 的大作中提到】
: That answer is wrong,
: it should be
: int left = maxSum(root->left, max);
: int right = maxSum(root->right, max);
: int sum = left + right + root->data;
: int localMax = max(sum, max(left,right));
: if(sum > *max)
: *max = sum;
: return max;

r**********1
发帖数: 292
42
如果你说这个函数没返回subtree的"root",是有这个问题。但是,对于sum值,是没问
题的。和peking2一样的啊。而且算法关键是recursive就行了啊。
对于包子,我也不在乎。但是我是前几个发帖子的,而且实现给了关键点了啊,怎么着
,我要个包子,我是理直气壮的吧。

【在 l*****a 的大作中提到】
: 不work
: why 包子

r**********1
发帖数: 292
43
我又看了一遍,这段就是对叶子节点的直接处理,避免了进一步的call。 我不觉的这
样有啥不妥的。

【在 p*****2 的大作中提到】
: 这段有必要吗?
: if((root->left == NULL) && (root->right == NULL))
: {
: if(root->data > *max)
: *max = root->data;
: return root->data;
: }

p*****2
发帖数: 21240
44

如果树大的话,每一个node都要进行判断,会影响performance.当然这不是关键,关键
就是代码看起来不简洁。

【在 r**********1 的大作中提到】
: 我又看了一遍,这段就是对叶子节点的直接处理,避免了进一步的call。 我不觉的这
: 样有啥不妥的。

S******t
发帖数: 151
45
第一题递归,第二题树形DP啊
e***s
发帖数: 799
46
求教,第二题DP怎么写?

【在 S******t 的大作中提到】
: 第一题递归,第二题树形DP啊
h********w
发帖数: 221
47
题目是binary tree not BST

【在 r**********1 的大作中提到】
: 第二题:
: http://puddleofriddles.blogspot.com/2012/01/write-program-to-fi
: 包子啊。

1 (共1页)
进入JobHunting版参与讨论
相关主题
微软面试的一道题least common ancestor的疑惑
A家,link all node in the same lev插入节点到complete binary tree的末尾
find treenode with two indegreesrecovery BST 不考虑相同值的情况么?
Twitter电面未通过Amazon 打印给定node距离最近的K个nodes
问个google面试题问一道google面经
请教这么一个题:BST maximum sum path这个check whether a binary tree is a BST or not
BST 找重复节点数判断 bst 疑问
关于inordertraversal 的iterative way借人气问一道Samsung的题
相关话题的讨论汇总
话题: int话题: node话题: root话题: path话题: null