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。
有没有更好的方法来描述这种继承?
答案 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
关系会产生各种问题。有两种方法:
树节点的界面如下所示:
interface TreeNode {
void setLeft(TreeNode node);
TreeNode getLeft();
void setRight(TreeNode node);
TreeNode getRight();
};
注意这个特殊问题,泛型是传统的选择。
答案 2 :(得分:1)
由于你无法真正覆盖成员变量,所以使用getter(即getLeft()
和getRight()
来强制执行此操作,因为您可以使返回类型更具体。这将其固定在消费者方面。但是,这些方法可能需要施放。