0

我需要构建一个看起来像这样的树:
在此处输入图像描述

因此,我从用户那里获取了 2 个数字,a并且b. a定义行数,并b定义起始根节点值。所以如果我有a=5 和b=3,那么我们得到:
在此处输入图像描述

我基本上只是将它打印到控制台。我真的迷失了如何开始。谁能在正确的方向上给我一点推动?

4

2 回答 2

2

这是帕斯卡三角形,第 n 行第 k 列的值为 b *(n 选择 k),其中 n 和 k 都是零索引,并且(n 选择 k)= n!/ (k! * (nk)!)

一旦你弄清楚了这一点,那么解决问题的方法就是编写一个函数int choose(int n, int k)并在控制台上布置正方形。

布局是最难的部分,但这里有一个方法:

  1. 首先,您需要选择一个宽度,以便将数字打印出来。假设它是 W。可能 W = 3 会很好。
  2. 其次,您需要弄清楚在每行的开头要打印多少个空格。每行都会为打印部分增加 W + 1 宽度,因此您需要在后续每一行之前减少 (W + 1) / 2 空间,在 (a - 1) 行以 0 空间结束。这意味着 (a - n - 1) * (W + 1) / 2 行 n 上的空格。
  3. 三、需要写一个函数int choose(int n, int k)
  4. 最后,您只需要遍历行,首先打印由步骤 2 确定的空格数,然后打印使用步骤 3 中的函数计算的数字,确保使用类似的方式打印printf("%-*d ", W, b * choose(n, k));它们以保持它们对齐。
于 2013-09-17T10:19:04.697 回答
1

一种方法可能是向下“增长”树......给定行数,您可以计算出树中有多少元素并分配适当大小的数组。

然后从顶部开始,假设行从 1 开始编号,down_left(x) = x + row(x)其中x是数组索引,row(x)是所属行号xdown_right(x) = down_left(x) + 1.

从顶部开始,然后向下左和向下右。然后对于您刚刚创建的下一行中的每个元素执行相同的操作,除了添加到下面的行以获得“父”数字的累积效果。

例如,如果用户要求 3 行和 3 的根值。

您知道您将需要 6 个数组元素。分配 6 个元素并将它们归零。

第 1 行:放入3数组 [0]。第 n 行:通过查看前一行中的每个元素来创建,称为 i。然后做array[down_left(i)] += iarray[down_right(i)] += i。这将创建第 n 行。重复。

无论如何,这是一个粗略的想法,玩一玩,看看它会把你带到哪里...... :)

于 2013-09-17T09:46:55.263 回答