Java中的二进制树抽象

时间:2014-07-06 01:24:15

标签: java inheritance

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。
有没有更好的方法来描述这种继承?

3 个答案:

答案 0 :(得分:4)

您可能希望使用通用TreeNode,它可以包含您需要的Watever类型。这可能是这样的:

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

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

一起使用

答案 1 :(得分:2)

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

  1. 了解泛型。有关示例,请参阅Java容器库。
  2. 编程到界面。
  3. 树节点的界面如下所示:

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

    注意这个特殊问题,泛型是传统的选择。

答案 2 :(得分:1)

由于你无法真正覆盖成员变量,所以使用getter(即getLeft()getRight()来强制执行此操作,因为您可以使返回类型更具体。这将其固定在消费者方面。但是,这些方法可能需要施放。