gpt4 book ai didi

java - 从递归中画出一棵基本树?

转载 作者:行者123 更新时间:2023-12-01 12:36:43 27 4
gpt4 key购买 nike

我正在尝试学习递归,但根本不理解它。有人可以向我展示构建这样的树的示例代码吗?我觉得这将有助于查看图形递归

Tree

假设有一个 line 方法,其参数为顶部和底部 x 和 y 坐标,我该如何处理?

谢谢!还有关于递归的推荐教程等吗?

最佳答案

当然,有很多不同的方法可以递归地实现这一点 - 这是其中之一:

public void drawTree(Graphics g, int x, int y, int arity, int depth) {
if (depth > 0) {
int childDistanceX = (int) (Math.pow(arity, depth) * DISTANCE_X);
int childX = x - (arity - 1) * childDistanceX / 2;
int childY = y - DISTANCE_Y;

for (int child = 0; child < arity; child++) {
g.drawLine(x, y, childX, childY);
drawTree(g, childX, childY, arity, depth - 1);
childX += childDistanceX;
}
}
}

给定根节点的x,y坐标、子节点的数量(arity)和树的深度,这方法首先根据常量 DISTANCE_X 计算子节点之间的水平距离,该常量是叶节点之间的水平间隙。

有了这些信息,再加上第二个常量 DISTANCE_Y(它给出了树的不同级别之间的垂直距离),我们就可以计算出树的 x,y 位置根节点的最左边的子节点。

然后只需迭代所有子节点并从根到子节点画一条线即可。这也是递归发挥作用的地方:我们递归地调用该方法,但每次当前的子级都成为新的根。另请注意,子树所管理的子树的深度比其父树的深度小 1,因此我们在递归调用中传递 深度 - 1

您可以通过复制并粘贴到以下类中来尝试上述方法:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TreeTest extends JPanel {
private static final int DISTANCE_X = 4;
private static final int DISTANCE_Y = 60;

private int treeArity = 3;
private int treeDepth = 3;

public void paintComponent(Graphics g) {
Dimension size = getSize();
int x = size.width / 2;
int y = (size.height + treeDepth * DISTANCE_Y) / 2;

drawTree(g, x, y, treeArity, treeDepth);
}

public static void main(String[] args) throws Exception {
TreeTest main = new TreeTest();

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(main);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);

frame.setVisible(true);
}
}

关于java - 从递归中画出一棵基本树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25515292/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com