这个树遍历叫什么?

What's this tree traversal called?

给定一棵树 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
          +--I
      +-- G 
   */
  let m = [];
  m['A'] = ['B','E'];
  m['B'] = ['C','D'];
  m['E'] = ['F','G'];
  m['F'] = ['H','I'];
  function main(id){
      function leftdfs(id, queue=[]){
          if(m[id]){
              leftdfs(m[id][0], queue);
              console.log(id);
              queue.push(m[id][1]);
          }else{
              console.log(id);
          }
      }
      let queue = [id];
      while(queue.length){
          let id = queue.shift();
          leftdfs(id, queue)
      }
  }
  //CBADHFEIG
  main('A');

我不认为它有一个名字。正如你所定义的,它不仅限于二叉树(不像"in-order"),而且可以用于n叉树。

与另一个答案一样,我将在此处提供递归实现,但使用单个堆栈:

  1. 将给定节点放入堆栈
  2. 如果节点有子节点,则对每个子节点递归应用此例程
  3. 如果节点没有子节点,则弹出并访问堆栈中的所有节点。

下面是该算法的 JavaScript 实现,它将 运行 显示在下图中:

           a 
        /     \
      r         e
    / | \     / | \
   G  h  N   d  i  t  
      |     / \    |
      p    o   L   s

预期的遍历将按以下顺序列出节点:"GraphNodeList"

function traverse(adjacency, id, visit, stack=[]) {
    stack.push(id);
    if (adjacency[id]) {
        for (let child of adjacency[id]) traverse(adjacency, child, visit, stack);
    } else {
        while (stack.length) visit(stack.pop());
    }
}

// Example run
let adjacency = { a: 're', r: 'GhN', h: 'p', e: 'dit', d: 'oL', t: 's' };
traverse(adjacency, 'a', console.log); // log each visited node to console.