由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - DFS用stack不用递归的话怎么color node?
相关主题
Depth-First-SearchDFS为什么要用3个color
有向图判断有无环DFS比BFS好在哪?
问一个graph题请问如果要求in place的话,递归是不是就不能用了?
问一个题amazon一道面试题
分享:non-recursive breadth first search and depth first search algorithm in C题目: iterative binary tree post order traversal
遍历二叉树除了recursion还有啥好办法?MS onsite 面经
这个题目有什么trickHow to find the kth biggest number in a BST
G家电面面经--佛云了~~L家这题咋搞,巨变态
相关话题的讨论汇总
话题: node话题: stack话题: color话题: current话题: 递归
进入JobHunting版参与讨论
1 (共1页)
y*******g
发帖数: 6599
1
att
CLRS上用grey 表示第一次发现node, black表示finish
在递归的时候很明确,但用stack的话怎么区分 grey/black?
s****j
发帖数: 67
2
第一次发现应该是push的时候,第一次处理是pop,但处理不代表该节点finish了
感觉可以通过stack的size来判断

【在 y*******g 的大作中提到】
: att
: CLRS上用grey 表示第一次发现node, black表示finish
: 在递归的时候很明确,但用stack的话怎么区分 grey/black?

s****j
发帖数: 67
3
如果当前stack的size小于某个node push进stack时候的size,那么表示这个node
finish了
correct me if im wrong
y*******g
发帖数: 6599
4
给个code?
哪什么时候pop啊?
一般的写法是
while(!stack.empty()) {
Node current = stack.top();
stack.pop();
//push all edge
}
但pop之后就没法在访问了吧

【在 s****j 的大作中提到】
: 第一次发现应该是push的时候,第一次处理是pop,但处理不代表该节点finish了
: 感觉可以通过stack的size来判断

s****j
发帖数: 67
5
粗略想法:
再开一个stack
while (!stack.empty()) {
Node current=stack.top();
stack.pop();
//color current to grey
current->pos=stack.size(); // anyway, record current stack size
stack2.push(current);
//push all edge
while (!stack2.empty() && stack2.top()->pos==stack.size()) {
Node t=stack2.top();
//color t to black
stack2.pop();
}
}

【在 y*******g 的大作中提到】
: 给个code?
: 哪什么时候pop啊?
: 一般的写法是
: while(!stack.empty()) {
: Node current = stack.top();
: stack.pop();
: //push all edge
: }
: 但pop之后就没法在访问了吧

c******o
发帖数: 534
6
不明白,用stack进行DFS为什么要color node?
color node用来做什么?
y*******g
发帖数: 6599
7
判断edge的种类啊,tree/back/forward or crossing/
不color怎么做到?

【在 c******o 的大作中提到】
: 不明白,用stack进行DFS为什么要color node?
: color node用来做什么?

y*******g
发帖数: 6599
8
怎么push?是进第一个还是第二个stack? 感觉要不停的开stack,,也就是递归了

【在 s****j 的大作中提到】
: 粗略想法:
: 再开一个stack
: while (!stack.empty()) {
: Node current=stack.top();
: stack.pop();
: //color current to grey
: current->pos=stack.size(); // anyway, record current stack size
: stack2.push(current);
: //push all edge
: while (!stack2.empty() && stack2.top()->pos==stack.size()) {

s****j
发帖数: 67
9
我觉得code已经写得比较清楚了。。。
就两个stack
一个是原stack,里面是待扩展的node
一个只记录处理过的node,用于color black

【在 y*******g 的大作中提到】
: 怎么push?是进第一个还是第二个stack? 感觉要不停的开stack,,也就是递归了
y*******g
发帖数: 6599
10
好像明白了一些,我写完整了再看看
多谢

【在 s****j 的大作中提到】
: 我觉得code已经写得比较清楚了。。。
: 就两个stack
: 一个是原stack,里面是待扩展的node
: 一个只记录处理过的node,用于color black

相关主题
遍历二叉树除了recursion还有啥好办法?DFS为什么要用3个color
这个题目有什么trickDFS比BFS好在哪?
G家电面面经--佛云了~~请问如果要求in place的话,递归是不是就不能用了?
进入JobHunting版参与讨论
B*******1
发帖数: 2454
11
为什么一定要用stack,不用递归呢?

【在 y*******g 的大作中提到】
: 判断edge的种类啊,tree/back/forward or crossing/
: 不color怎么做到?

y*******g
发帖数: 6599
12
递归太深会overflow啊

【在 B*******1 的大作中提到】
: 为什么一定要用stack,不用递归呢?
B*******1
发帖数: 2454
13
一般面试不会这么深吧?
y*******g
发帖数: 6599
14
面试可以直接要求不许递归

【在 B*******1 的大作中提到】
: 一般面试不会这么深吧?
c****p
发帖数: 6474
15
edge种类可以通过discover time和finish time确定吧。

【在 y*******g 的大作中提到】
: 判断edge的种类啊,tree/back/forward or crossing/
: 不color怎么做到?

B*******1
发帖数: 2454
16
但是存颜色跟存这个time其实问题是一样的吧。

【在 c****p 的大作中提到】
: edge种类可以通过discover time和finish time确定吧。
c****p
发帖数: 6474
17
嗯。。。也对。。

【在 B*******1 的大作中提到】
: 但是存颜色跟存这个time其实问题是一样的吧。
e***l
发帖数: 710
18
直接用一个额外的数组(或者node对象的一个分量)记录颜色,颜色标记的顺序应该和
递归的方法相同:
所有node标白色;
root标灰色并入栈;
while(栈非空){
取得栈顶元素,//必为灰色
找到它第一个白色的邻接node,将其标灰并入栈, //注1
如果没有找到白色邻接node,将栈顶元素标黑并出栈。//所有邻接node已发现
}
注1:可以对每个node记录“已经访问到了第几个邻接node”,避免每次从头搜索
1 (共1页)
进入JobHunting版参与讨论
相关主题
L家这题咋搞,巨变态分享:non-recursive breadth first search and depth first search algorithm in C
请教一道面试题遍历二叉树除了recursion还有啥好办法?
这题被问过两次都不会,请教这个题目有什么trick
二叉树最长路径 用 level order travel 做?G家电面面经--佛云了~~
Depth-First-SearchDFS为什么要用3个color
有向图判断有无环DFS比BFS好在哪?
问一个graph题请问如果要求in place的话,递归是不是就不能用了?
问一个题amazon一道面试题
相关话题的讨论汇总
话题: node话题: stack话题: color话题: current话题: 递归