设置父节点

时间:2015-08-14 21:09:47

标签: java recursion tree binary-tree

我的树类:

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()我不知道如何设置我当前的节点。

即使是正确方向的推动也会受到赞赏。

[编辑] 为了澄清,基于我的树的结构,如何用另一个单独的树(子树)替换特定节点。

2 个答案:

答案 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建议的那样。