从递归中绘制一个基本树?

时间:2014-08-26 21:18:27

标签: java recursion

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

Tree

假设有一个包含顶部和底部x和y坐标参数的线方法,我将如何解决这个问题?

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

1 个答案:

答案 0 :(得分:1)

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

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)和depth,此方法首先计算基于子节点的子节点之间的水平距离在常量DISTANCE_X上,这是叶节点之间的水平间隙。

利用这些信息,以及第二个常量DISTANCE_Y,它给出树的不同层之间的垂直距离,我们可以计算根节点左侧的x,y位置 - 大多数孩子。

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

你可以通过copy&amp; amp;把它粘贴到下面的课程中:

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);
    }
}