Redian新闻
>
我来问个面经:打印binary tree 从root到leaf的所有path
avatar
我来问个面经:打印binary tree 从root到leaf的所有path# JobHunting - 待字闺中
j*3
1
但是不能用recursion。
有人说,用stack, 我百思不得其解,这也不是pre/in order traverse, 咋用stack呢?
我想了一个办法,还是用queue,但是每个node换一个新class,带个parent。
可是这样就要造一个新class。
有什么办法还用原来的treenode么?
avatar
o*y
2
Stack stack = new Stack();
List list = new ArrayList();
TreeNode cur = root, pre = null;
stack.push(cur);
while(!stack.isEmpty()){
cur = stack.peek();
if((cur.left == null && cur.right == null) || (pre != null && (
cur.left == pre || cur.right == pre))){
cur = stack.pop();
if(cur.left == null && cur.right == null){
list.add(cur);
printPath(list);
}
list.remove(list.size()-1);
pre = cur;
}else{
if(cur.right != null)
stack.push(cur.right);
if(cur.left != null)
stack.push(cur.left);
list.add(cur);
}
}
avatar
b*b
3
psudo code:
List> result = new ArrayList<>();
List> inProgress = new ArrayList<>();
inProgress.add(new ArrayList<>(root));
while(!inProgress.isEmpty())
{
List cur = inProgress.remove(0);
if (cur.left == null && cur.right == null)
{
result.add(cur);
continue;
}
if (cur.left != null)
{
List newLeft = new List(cur);
newLeft.add(cur.left);
inProgress.add(newLeft);
}
//do the same for the right
}
return result;

呢?

【在 j**********3 的大作中提到】
: 但是不能用recursion。
: 有人说,用stack, 我百思不得其解,这也不是pre/in order traverse, 咋用stack呢?
: 我想了一个办法,还是用queue,但是每个node换一个新class,带个parent。
: 可是这样就要造一个新class。
: 有什么办法还用原来的treenode么?

avatar
b*b
4
ha, BFS and DFS, lol

【在 b******b 的大作中提到】
: psudo code:
: List> result = new ArrayList<>();
: List> inProgress = new ArrayList<>();
: inProgress.add(new ArrayList<>(root));
: while(!inProgress.isEmpty())
: {
: List cur = inProgress.remove(0);
: if (cur.left == null && cur.right == null)
: {
: result.add(cur);

avatar
p*2
5

呢?
post order行吗?用一个list模拟stack。这样可以从list直接打印结果。

【在 j**********3 的大作中提到】
: 但是不能用recursion。
: 有人说,用stack, 我百思不得其解,这也不是pre/in order traverse, 咋用stack呢?
: 我想了一个办法,还是用queue,但是每个node换一个新class,带个parent。
: 可是这样就要造一个新class。
: 有什么办法还用原来的treenode么?

avatar
l*s
6
两个Queue也可以吧,Queue 和 Queue,保持两个Queue同步就行了

It's accepted by leetcode.
private IList allPath(TreeNode root){
Queue queue = new Queue();
Queue qStr = new Queue();
IList result = new List();
if(root == null) return result;
queue.Enqueue(root); qStr.Enqueue(root.val.ToString());
while(queue.Count != 0){
TreeNode cur = queue.Dequeue();
string curStr = qStr.Dequeue();
if(cur.left == null && cur.right == null) result.Add(curStr);
if(cur.left != null){
queue.Enqueue(cur.left);
qStr.Enqueue(curStr + "->" + cur.left.val);
}
if(cur.right != null){
queue.Enqueue(cur.right);
qStr.Enqueue(curStr + "->" + cur.right.val);
}
}
return result;
}
avatar
j*3
7
why post order

【在 p*****2 的大作中提到】
:
: 呢?
: post order行吗?用一个list模拟stack。这样可以从list直接打印结果。

avatar
j*3
8
that's more space. how to do it with less space?

【在 l******s 的大作中提到】
: 两个Queue也可以吧,Queue 和 Queue,保持两个Queue同步就行了
: 。
: It's accepted by leetcode.
: private IList allPath(TreeNode root){
: Queue queue = new Queue();
: Queue qStr = new Queue();
: IList result = new List();
: if(root == null) return result;
: queue.Enqueue(root); qStr.Enqueue(root.val.ToString());
: while(queue.Count != 0){

avatar
l*s
9
没有很多space,因为中间过程并没有比结果更多使用space。唯一的concern是
treenode那个queue,不过你似乎也是要必用的,这个也不是问题,除非你不用bfs。

【在 j**********3 的大作中提到】
: that's more space. how to do it with less space?
avatar
k*r
10
which language it is?

【在 l******s 的大作中提到】
: 两个Queue也可以吧,Queue 和 Queue,保持两个Queue同步就行了
: 。
: It's accepted by leetcode.
: private IList allPath(TreeNode root){
: Queue queue = new Queue();
: Queue qStr = new Queue();
: IList result = new List();
: if(root == null) return result;
: queue.Enqueue(root); qStr.Enqueue(root.val.ToString());
: while(queue.Count != 0){

avatar
l*s
11
C#

【在 k****r 的大作中提到】
: which language it is?
avatar
k*r
12
nice one!
Iooks like java :)

【在 l******s 的大作中提到】
: C#
avatar
I*g
13
确实是:
qStr有很多重复,这样,space 明显增多。
leetcode 没有detect。

【在 l******s 的大作中提到】
: 没有很多space,因为中间过程并没有比结果更多使用space。唯一的concern是
: treenode那个queue,不过你似乎也是要必用的,这个也不是问题,除非你不用bfs。

avatar
j*3
14
so what is the best solution for this problem?

【在 I*******g 的大作中提到】
: 确实是:
: qStr有很多重复,这样,space 明显增多。
: leetcode 没有detect。

avatar
I*g
15
用stack做 backtrack 是最好的方法,

【在 j**********3 的大作中提到】
: so what is the best solution for this problem?
avatar
d*e
16
这个用经典的stack backtrack
第一次进入标记并加入path stack
第二次弹出
用两个stack

【在 j**********3 的大作中提到】
: so what is the best solution for this problem?
avatar
j*3
17
请具体说说,我看到有人说stack,但不知道咋做。。。

【在 I*******g 的大作中提到】
: 用stack做 backtrack 是最好的方法,
avatar
p*g
18
如果再定义一个类,里面包含一个状态位和一个树节点。
入栈,出栈都是对这个新的类来操作。
如果是这样,就很容易实现。不加状态位就感觉很麻烦。
坐等大牛来解答。

【在 j**********3 的大作中提到】
: 请具体说说,我看到有人说stack,但不知道咋做。。。
avatar
g*e
19
recursion不就是build stack吗?
[在 jobhunter123 (jobhunting) 的大作中提到:]
:但是不能用recursion。

:...........
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。