Algorithm 什么';这个树遍历叫做什么?
给定一棵树根上有aAlgorithm 什么';这个树遍历叫做什么?,algorithm,tree,tree-traversal,Algorithm,Tree,Tree Traversal,给定一棵树根上有a A +-- B | +-- C | +-- D +-- E +-- F +-- G 我希望遍历是 C,B,A,D,F,E,G 这可以通过从叶子到根的所有路径开始构建 C,B,A D,B,A F,E,A G,E,A 然后删除所有已经遇到的节点 C,B,A D F,E G 这个遍历有名字吗?我不知道名字,但算法可以是: half-explore: inorder style (I mapped the first "read" el
A
+-- B
| +-- C
| +-- D
+-- E
+-- F
+-- G
我希望遍历是
C,B,A,D,F,E,G
这可以通过从叶子到根的所有路径开始构建
C,B,A
D,B,A
F,E,A
G,E,A
然后删除所有已经遇到的节点
C,B,A
D
F,E
G
这个遍历有名字吗?我不知道名字,但算法可以是:
half-explore:
inorder style (I mapped the first "read" element to be the left)
except for the right node: push it to a FIFO
whenever _half-explored_ some node, get the right node to explore from FIFO and half-explore it
/*
A.
+--B
|+--C
|+--D
+--E
+--F
+--H
+--我
+--G
*/
设m=[];
m['A']=['B','E'];
m['B']=['C','D'];
m['E']=['F','G'];
m['F']=['H','I'];
主功能(id){
函数leftdfs(id,队列=[])){
if(m[id]){
leftdfs(m[id][0],队列);
console.log(id);
queue.push(m[id][1]);
}否则{
console.log(id);
}
}
让队列=[id];
while(queue.length){
设id=queue.shift();
leftdfs(id,队列)
}
}
//CBADHFEIG
主要(‘A’)代码>我不知道名称,但算法可以是:
half-explore:
inorder style (I mapped the first "read" element to be the left)
except for the right node: push it to a FIFO
whenever _half-explored_ some node, get the right node to explore from FIFO and half-explore it
/*
A.
+--B
|+--C
|+--D
+--E
+--F
+--H
+--我
+--G
*/
设m=[];
m['A']=['B','E'];
m['B']=['C','D'];
m['E']=['F','G'];
m['F']=['H','I'];
主功能(id){
函数leftdfs(id,队列=[])){
if(m[id]){
leftdfs(m[id][0],队列);
console.log(id);
queue.push(m[id][1]);
}否则{
console.log(id);
}
}
让队列=[id];
while(queue.length){
设id=queue.shift();
leftdfs(id,队列)
}
}
//CBADHFEIG
主要(‘A’)代码>我想它没有名字。正如您所定义的,它不仅限于二叉树(与“顺序”不同),而且可以用于n元树
与另一个答案一样,我将在这里提供一个递归实现,但使用单个堆栈:
将给定节点放在堆栈上
如果节点有子节点,则对每个子节点递归应用此例程
如果节点没有子节点,则弹出并访问堆栈中的所有节点
下面是该算法的JavaScript实现,将在下图中运行:
a
/ \
r e
/ | \ / | \
G h N d i t
| / \ |
p o L s
预期的遍历将按以下顺序列出节点:“GraphNodeList”
函数遍历(邻接、id、访问、堆栈=[]){
堆栈推送(id);
if(邻接[id]){
for(让邻接子项[id])遍历(邻接、子项、访问、堆栈);
}否则{
while(stack.length)访问(stack.pop());
}
}
//示例运行
设邻接={a:re',r:GhN',h:p',e:dit',d:oL',t:s'};
遍历(邻接,'a',console.log);//将每个访问的节点记录到控制台。
我认为没有它的名称。正如您所定义的,它不仅限于二叉树(与“顺序”不同),而且可以用于n元树
与另一个答案一样,我将在这里提供一个递归实现,但使用单个堆栈:
将给定节点放在堆栈上
如果节点有子节点,则对每个子节点递归应用此例程
如果节点没有子节点,则弹出并访问堆栈中的所有节点
下面是该算法的JavaScript实现,将在下图中运行:
a
/ \
r e
/ | \ / | \
G h N d i t
| / \ |
p o L s
预期的遍历将按以下顺序列出节点:“GraphNodeList”
函数遍历(邻接、id、访问、堆栈=[]){
堆栈推送(id);
if(邻接[id]){
for(让邻接子项[id])遍历(邻接、子项、访问、堆栈);
}否则{
while(stack.length)访问(stack.pop());
}
}
//示例运行
设邻接={a:re',r:GhN',h:p',e:dit',d:oL',t:s'};
遍历(邻接,'a',console.log);//将每个访问的节点记录到控制台。
不确定名称,似乎是电源集。
。。。。然而,你可以从根到叶,而不是从C B A开始,这更容易,这只是一个预先的顺序,然后将其反转,并维护一个集
,以确保你不添加重复项。你的想法是正确的。从叶子穿过,不一定到根。只需从每个叶开始进行深度优先遍历,在到达每个叶时标记访问的节点。仅遍历未访问的节点。您不需要删除任何节点。不确定名称,似乎是一个电源集
。。。。然而,你可以从根到叶,而不是从C B A开始,这更容易,这只是一个预先的顺序,然后将其反转,并维护一个集
,以确保你不添加重复项。你的想法是正确的。从叶子穿过,不一定到根。只需从每个叶开始进行深度优先遍历,在到达每个叶时标记访问的节点。仅遍历未访问的节点。您不需要删除任何节点。