如何在Java中生成树?

时间:2013-09-28 22:00:06

标签: java tree graph-theory

那么我该如何解决这个问题呢?我需要一个从标准输入读取正整数n的程序,并向标准输出写入顶点集合{1,2,3 .... n}上所有不同的有根,有序,标记树的表示。

对于输出,我需要使用树L(t)的以下线性文本表示t

 If t is empty then L(t) = ().
 If t has root n and children, in sibling order, C = (c1; c2; : : : ; ck), then
 L(t) = (n, (L(c1), L(c2), : : :, L(ck)))
 where, L(ci) denotes the linear textual representation of the subtree rooted at
  child ci. There is a single space after each comma in the representation.

输出应该包含每行上一棵树的表示,应该是 按行词典顺序排序,以线性表示形式查看为字符串。该 输出应该不包含任何其他内容(例如虚假的换行符,提示符或 信息性消息)。 n = 1的样本输入和输出; 2;出现在下面。

enter code here

Input: 1
Output:
(1, ())
Input: 2
Output:
(1, ((2, ()))) 
(2, ((1, ())))

enter code here

任何帮助都将在很大程度上受到赞赏。我只需要转向一个方向。现在,我完全难过了:(

1 个答案:

答案 0 :(得分:0)

您可以递归生成树。从root开始。根可以有0,1,2 ...(m - 1)个子节点,其中m是您要放置的顶点数。首先将(m - 1)个顶点放在根下面,然后一直向下移动到0.你将以递归方式“放置”这些顶点,因此在根下放置一个顶点作为子节点意味着再次调用相同的方法,但是这次孩子的最大数量会少一些。

你会得到两个递归的停止标准:

  • 您已经放置了所有N个顶点。您需要输出当前树,然后使用尚未定义的L(t)函数,然后回溯以尝试不同的树。
  • 算法为所有叶顶点提供了0度,并且还没有放置n个顶点。不要输出这棵树,因为它无效,但是回溯。

算法在尝试为根节点0提供子节点后完成。

对于输出L(t)函数,似乎足以进行深度优先树遍历。递归是最容易编程的(因为这似乎是某种实际的任务,这可能是他们想要你做的)。如果您需要速度,请在Wikipedia上查找非递归深度优先树遍历算法。