【问题标题】:Binary Tree Abstraction in JavaJava中的二叉树抽象
【发布时间】:2014-07-06 09:37:57
【问题描述】:

Java中基本的二叉树节点可以定义为:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int val) {
        this.val = val;
    }
}

但在许多情况下,我需要向树节点添加字段,例如大小、高度、深度或颜色。 如果我不想重写左子节点和右子节点的所有定义并尝试直接继承:

public class TreeNodeWithDepth extends TreeNode{
    int depth;
    TreeNodeWithDepth(int val, int depth) {
        super(val);
        this.depth = depth;
    }
}

不行,因为TreeNodeWithDepth的左右还是TreeNode。
有没有更好的方式来描述这种继承?

【问题讨论】:

  • 您确定要直接在树的节点上使用大小、高度和颜色等属性吗?似乎不是存储您的 int val,您应该为所需的所有属性创建一个包装器对象,然后将它们存储在该对象中,而不是直接存储在树节点上。 (见亚历克斯的回答)
  • Java 类继承:一次都没有。

标签: java inheritance


【解决方案1】:

您可能希望使用通用的TreeNode,它可以容纳您需要的任何类型的类。可能看起来像这样:

public class TreeNode<T> {
    T val;
    TreeNode<T> left;
    TreeNode<T> right;
    TreeNode(T val) {
        this.val = val;
    }
}

然后您可以创建一个类来保存您需要的值并将其与TreeNode 一起使用

【讨论】:

    【解决方案2】:

    不要这样做。使用继承来实现has a 关系会产生各种问题。有两种方法:

    1. 了解泛型。有关示例,请参阅 Java 容器库。
    2. 编程到接口。

    树节点的界面如下所示:

    interface TreeNode {
      void setLeft(TreeNode node);
      TreeNode getLeft();
      void setRight(TreeNode node);
      TreeNode getRight();
    };
    

    注意这个特殊问题,泛型是常规选择。

    【讨论】:

      【解决方案3】:

      由于您不能真正覆盖成员变量,因此使用 getter 怎么样,即 getLeft()getRight() 来强制执行此操作,因为您可以使返回类型更具体。这将其固定在消费者方面。不过,这些方法可能必须强制转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多