Algorithm 什么';这个树遍历叫做什么?

Algorithm 什么';这个树遍历叫做什么?,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

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开始,这更容易,这只是一个预先的顺序,然后将其反转,并维护一个
    ,以确保你不添加重复项。你的想法是正确的。从叶子穿过,不一定到根。只需从每个叶开始进行深度优先遍历,在到达每个叶时标记访问的节点。仅遍历未访问的节点。您不需要删除任何节点。