Java软件设计:制作泛型树-打印库

Java Software design: Making a generic tree - printing library

我正在为树数据结构编写一个项目——具体来说,它将提供的主要功能是以不同的方式显示给定的树(JFrame canvas 屏幕上的不同布局) .为了简单起见,我假设需要打印的树总是二叉树。

计算布局的算法需要我对树进行inorder/preorder/postorder遍历。在我的项目中,我将编写类似于以下的方法:

class MyBinaryTreePrinterProject{

public void inOrderTraversal(Object root){
    // do inorder traversal
}

public void preOrderTraversal(Object root){
    // do preorder traversal
}

public void postOrderTraversal(Object root){
    // do postorder traversal
}
}

根节点作为 object 传递,因为二叉树可能在其他一些具有自定义 class 定义的外部项目中定义。例如,以下是两个项目,它们有自己的 class 表示二叉树的定义:

// Tree definition in some unrelated Project A
class ProjectATreeNode{
public ProjectATreeNode left;
public ProjectATreeNode right;
...
}

// Tree definition in some unrelated Project B
class ProjectBTreeNode{
public ProjectBTreeNode leftChild;
public ProjectBTreeNode rightChild;
...
}

classMyBinaryTreePrinterProject 中的方法如何知道所提供的二叉树的结构?例如,项目 A 中的二叉树有一个名为 'left' 的字段来访问左侧 child,而项目 B 将其命名为 'leftChild'。我最初的想法是使用 Java 反射(以及要求用户提供访问 left/right children 的字段名称),但我不确定这是否是正确的方法去吧。

是否存在更好的设计?

您应该提供一个 MyBinaryTree 接口,客户端必须实现该接口。

在这种情况下可能

interface MyBinaryTree {
    MyBinaryTree getRoot();
    MyBinaryTree getParent();
    MyBinaryTree getLeft();
    MyBinaryTree getRight();
}

客户会

class TreeA implements MyBinaryTree {
    MyBinaryTree getRoot()
    {//do stuff}
    MyBinaryTree getParent()
    {//do stuff}
    MyBinaryTree getLeft()
    {//do stuff}
    MyBinaryTree getRight();
    {//do stuff}
}