我的树类:
public class BT<E>{
E value;
BT<E> left, right;
public BT(E value)
{
this.value=value;
}
public BT (E value, BT left, BT right)
{
this.value = value;
this.left = left;
this.right = right;
}
public Tree getLeft(){
return left;}
public Tree getRight(){
return right;}
public void setLeft(Tree ln){
left = ln;}
public void setRight(Tree rn){
right = rn;}
public Tree getParent(){
return this;}
我在main方法中递归生成两棵树。 T1
主树和T2
随机子树。
我可以在T1
中随机选择一个节点但是我无法替换T2
中随机选择的节点T1
AT 。
由于在给定节点,我只能setLeft()
和setRight()
我不知道如何设置我当前的节点。
即使是正确方向的推动也会受到赞赏。
[编辑] 为了澄清,基于我的树的结构,如何用另一个单独的树(子树)替换特定节点。
答案 0 :(得分:1)
您必须修复getParent
方法,或修复算法。由于我没有你的算法,我会告诉你第一个选项(这不是我最喜欢的选项):
public class BT<E> {
E value;
BT<E> left, right, parent;
public BT(E value) {
this.value = value;
this.parent = null;
}
public BT (E value, BT left, BT right) {
this.value = value;
setLeft(left);
setRight(right);
}
private static void setParentIfNotNull(BT<E> child, BT<E> parent) {
if (child != null) child.setParent(parent);
}
public void setLeft(BT<E> left) {
this.left = left;
setParentIfNotNull(left, this);
}
public void setRight(BT<E> right) {
this.right= right;
setParentIfNotNull(right, this);
}
// getters
}
答案 1 :(得分:0)
要删除(或替换)任意节点,您需要更新其父节点。因此,首先调用.getParent()
,然后您需要通过调用parent.getLeft() == nodeToRemove
来确定目标节点所在的一侧(左侧或右侧)(如果需要,还需要.getRight()
相同)。一旦您知道它是向左还是向右,请调用相应的.set...()
方法。
我最初没有注意到您的.getParent()
方法返回当前节点(this
)。那是不对的;父节点是指向 this
的节点。如果您无法修复.getParent()
实施,则需要更改算法以在遍历树时跟踪父节点,如@Dici建议的那样。