【发布时间】:2017-11-30 13:02:13
【问题描述】:
我目前正在将整数数组转换为具有给定顺序的树(可能是 2、3、4、5,...)。到目前为止,我只设法让它适用于 2 阶树,并且我正在努力实现更高阶的代码。
它的工作原理是,我们得到一组数字(例如 1 2 3 4 5 6 7 8 2),最后一个表示树的顺序。在本例中为 2,生成这棵树:
1
/ \
2 3
/ \ / \
4 5 6 7
/
8
然后,我们必须根据提供的数字对生成的构建树进行预排序和排序后打印。所以,对于pre-order 打印我得到1 2 4 8 5 3 6 7 和对于post-order 打印我得到8 4 5 2 6 7 3 1,这两个都是正确的答案。
我用于构建树的代码是:
public static Node arrayToTree(String[] input, int order) {
Node root = createNode(input, 1, order);
return root;
}
public static Node createNode(String[] input, int i, int order) {
if(i <= input.length) {
String val = input[i-1];
if(val != null){
Node t = new Node(val);
for(int j = 0; j < order; j++) {
t.children[j] = createNode(input, order * i + j, order);
}
return t;
}
}
return null;
}
class Node {
public Node[] children = new Node[64];
public String val;
public Node(String val) {
this.val = val;
}
}
实际的问题是如何在 createNode 函数中获取正确的索引,以便节点 t 的子节点实际上是正确的。因此,例如,如果输入为 1 2 3 4 3.. 表示树的顺序为 3,因此根为 1,并且有子节点 2、3 和 4。它们位于索引 1、2 和 3 上。
public static void main(String[]args) {
String[] input = new String[]{"1", "2", "3", "4", "5", "6", "7", "8"};
int order = 2;
Node tree = arrayToTree(input, order);
System.out.print("Preorder: ");
preorder(tree);
System.out.println();
System.out.print("Postorder: ");
postorder(tree);
}
public static void preorder(Node node) {
System.out.print(node.val + " ");
for(Node n : node.children) {
if(n != null) preorder(n);
}
}
public static void postorder(Node node) {
for(Node n : node.children) {
if(n != null) postorder(n);
}
System.out.print(node.val + " ");
}
这里是 postorder 和 preorder 打印的主要功能,让您了解稍后在主程序中应该如何工作。
【问题讨论】:
-
问题不清楚。订单2是什么意思?什么是后购和预购?
-
Order 表示一个节点可以有多少个子节点。预购是深度优先遍历。后序从最左边的节点开始,然后是兄弟姐妹(再次从兄弟姐妹最左边的后代开始),然后是父节点......我在问题中添加了链接
-
@BeginnerProgrammer 您的实际问题是什么?高阶会出现什么问题?
-
实际的问题是如何在 createNode 函数中获取正确的索引,以便节点 t 的子节点实际上是正确的。因此,例如,如果输入为 1 2 3 4 3.. 表示树的顺序为 3,因此根为 1,并且有子节点 2、3 和 4。它们位于索引 1、2 和 3 上。跨度>
-
发布我们可以运行并查看问题的代码(使用
main)。我看不到您发布的代码如何用于订单 2。我可能遗漏了一些东西。
标签: java tree binary-tree preorder postorder