Algorithm 遍历2-3-4树

Algorithm 遍历2-3-4树,algorithm,tree,traversal,tree-traversal,Algorithm,Tree,Traversal,Tree Traversal,我最近一直在思考,并提出了两种方法来查找2-3-4树的有序遍历。其中一种是递归方法,根据节点的类型进行切换,另一种是迭代方法。对于后台,此遍历的目标是从上面的树生成以下元素集 [S] / \ [J O] [U]

我最近一直在思考,并提出了两种方法来查找2-3-4树的有序遍历。其中一种是递归方法,根据节点的类型进行切换,另一种是迭代方法。对于后台,此遍历的目标是从上面的树生成以下元素集

                                     [S]
                                /            \
                            [J    O]           [U]
                           /   |    \          /  \
                       [EH]  [MN]  [PQR]   [T]   [VWX]

         { {E} {H} {J} {M} {N} {O} {P} {Q} {R} {S} {T} {U} {V} {W} {Z} }
由于一个节点上只能有2个、3个或4个子节点,因此我认为以下任一方法都可以使用伪代码

第一种方法是根据节点的当前大小,在必要时从根左、中左、中右、右递归:

list = new list
234InOrder(Node cur):

   switch(cur.numElems) 
      case 1: // 2-node
         234InOrder(cur.child[0])
         list.add(cur.child[0])
         234InOrder(cur.child[1])
         break;
      case 2: // 3-node
         234InOrder(cur.child[0])
         list.add(cur.child[0])
         234InOrder(cur.child[1])
         list.add(cur.child[1])
         234InOrder(cur.child[2])
         break;
      case 3: // 4-node
         234InOrder(cur.child[0])
         list.add(cur.child[0])
         234InOrder(cur.child[1])
         list.add(cur.child[1])
         234InOrder(cur.child[2])
         list.add(cur.child[2])
         234InOrder(cur.child[3])
         break;
或者迭代地转到最左边的节点,从该节点获取每个元素,返回父节点,继续下一个子节点,重复该过程。看到所有子级后,转到parent/root并从根的顺序继承者开始重复该过程。抱歉,没有伪代码

这些方法中哪一种更适合在树中获得所需的元素集?

我建议使用递归解决方案,因为它更易于实现和阅读。 此外,您还可以使用一个循环来消除这3个案例

假设您的节点数据结构如下所示:

class 234Node:
    keys: list of KeyType
    childs: list of Nodes
    # with 1 <= len(items) == len(childs) - 1 <= 3