将多路树转换为左子/右同级格式? 我试图编写C++代码,它给出了一个多路树,将树转换成一个表示在该树中的二叉树。例如,给定此树: A / | \ B C D / | \ | E F G H / \ I J A / B / \ E C \ \ F D / \ / I G H \ J A / | \ B C D / | \ | E F G H / \ I J

将多路树转换为左子/右同级格式? 我试图编写C++代码,它给出了一个多路树,将树转换成一个表示在该树中的二叉树。例如,给定此树: A / | \ B C D / | \ | E F G H / \ I J A / B / \ E C \ \ F D / \ / I G H \ J A / | \ B C D / | \ | E F G H / \ I J,c++,data-structures,tree,binary-tree,C++,Data Structures,Tree,Binary Tree,我想输出此树: A / | \ B C D / | \ | E F G H / \ I J A / B / \ E C \ \ F D / \ / I G H \ J

我想输出此树:

          A
        / | \
       B  C  D
     / | \   |
    E  F  G  H
      / \
     I   J
           A
          /
         B
       /   \
      E     C
       \     \
        F     D
       / \   /
      I   G H
       \
        J
          A
        / | \
       B  C  D
     / | \   |
    E  F  G  H
      / \
     I   J

我不知道如何处理这个问题。我应该如何考虑这样做?

有一个很好的递归洞察可以用来解决这个问题。我将让您了解如何在代码中实际实现这一点的细节,因为我不知道如何表示树,但这里是核心思想

首先,将空树转换为LC/RS格式非常容易:它返回为空树

另一方面,假设您有一棵非空树。首先,将其每个子级转换为LC/RS格式(递归)。例如,给定此树:

          A
        / | \
       B  C  D
     / | \   |
    E  F  G  H
      / \
     I   J
           A
          /
         B
       /   \
      E     C
       \     \
        F     D
       / \   /
      I   G H
       \
        J
          A
        / | \
       B  C  D
     / | \   |
    E  F  G  H
      / \
     I   J
首先,递归地将每个子级转换为LC/RS,并返回以下三棵树:

   B        C         D
  /                  /
 E                  H
  \
   F
  / \
 I   G
  \
   J
这些树目前是自由浮动的,彼此之间没有链接。但既然你知道它们是兄弟姐妹,你就要让C成为B的正确子对象,让D成为C的正确子对象。这本质上就是链表遍历。以下是完成后的情况:

         B
       /   \
      E     C
       \     \
        F     D
       / \   /
      I   G H
       \
        J
完成后,剩下要做的就是将B设为A的左子级,如下所示:

           A
          /
         B
       /   \
      E     C
       \     \
        F     D
       / \   /
      I   G H
       \
        J
总而言之,逻辑如下:

  • 如果要转换的树为空,则返回空树
  • 否则:
    • 递归地将根节点的每个子节点转换为LC/RS格式
    • 遍历这些树,分配正确的子链接以将树链接在一起
    • 将A的左子指针指定给指向结果树的指针(如果没有子指针,则指定为null)
<>我将把C++细节留给你填写。如果您试图解决此问题,但遇到了麻烦,请随时发布后续问题,详细说明您迄今为止编写的代码以及失败的特定测试用例或遇到的特定编译器错误。祝你好运


假定

假设二叉树的意思是根据,而多路树类似于二叉树,但具有可数子节点,而不是可选的左、右子节点,而算法是根据


类型

类型可以是以下模板-对于多路树:

template <typename T>
class CMultiWayTree {
public:
    typedef CMultiWayTree<T>*   NodePtr;
    typedef list<NodePtr>       List;
public:
    T                           m_tData;
protected:
    List                        m_lNodes;
public:
    // ...
};

你会发现一些有用的信息。只要阅读链接上的信息,练习一下,你就可以很快写出你的代码了!欢迎来到堆栈溢出!你能详细说明一下你是如何把树转换成二叉树的吗?您是否正在寻找类似左子女/右兄弟姐妹表示的内容?另外,你能更概括地告诉我们你到目前为止所做的尝试吗?我们很乐意帮忙,但是不知道你尝试了什么,很难做到这一点。@ ANA Najjar:你已经有了普通树和/或二叉树的C++类型或类声明吗?你所说的一般树到底是什么意思?在任意树上进行这种转换没有通用的算法。你必须自己找出需要使用的算法,stackoverflow.com上没有人会帮你;然后用C++实现它。@阿姆娜:我们能帮你吗?