将多路树转换为左子/右同级格式? 我试图编写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)
假定 假设二叉树的意思是根据,而多路树类似于二叉树,但具有可数子节点,而不是可选的左、右子节点,而算法是根据
类型 类型可以是以下模板-对于多路树:
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++实现它。@阿姆娜:我们能帮你吗?