在将常规树转换为二叉树之后,如何在给定节点的情况下找到父节点" v"使用二叉树的通用树?

时间:2014-10-18 01:02:00

标签: java algorithm tree binary-tree

我尝试了两种实现,但它们并没有完全发挥作用。

这是我完全坚持的实施之一。

/** Returns the parent of a given node or the node itself if it is the root */
public Position<E> parent(Position<E> v) throws IllegalArgumentException {
      if(bTree.isRoot(v)) { return v; } // returns the node v itself if v is the root.
      Position<E> parent = bTree.root(); 
      // execute this recursive method and return the parent. 
      return preorderTraversal(parent, v, null);
  }

/* This is the helper method that will traverse the binary tree in PreOrder. It updates 
 * the parent until the node v has been found.
 */
private Position<E> preorderTraversal(Position<E> focusNode, Position<E> v, Position<E> parent) {

     System.out.print(focusNode.getElement() + "\t");

      if (focusNode != null && v != focusNode && hasLeft(focusNode)) {
          parent = focusNode;
          System.out.print("setting parent to: " + parent.getElement() + "\t");
          preorderTraversal(bTree.left(focusNode), v, parent);
      }
      else if (focusNode != null && v != focusNode && hasRight(focusNode)){
          preorderTraversal(bTree.right(focusNode), v, parent);
      }
      return parent;
  }

// -------------- EXTRA HELPER METHODS ---------------
private boolean hasLeft(Position<E> temp ) {
      if (bTree.left(temp) != null) return true;
      else return false;
  }

  private boolean hasRight(Position<E> temp ) {
      if (bTree.right(temp) != null) return true;
      else return false;
  }

这里的问题似乎是它遍历左子树,并更新了正确的父节点,但在返回值时,它总是返回根节点。我似乎不明白为什么会这样。另一个是当遍历正确的子树时,我的父节点总是错误的。请帮忙!

1 个答案:

答案 0 :(得分:0)

你在不给出动力的情况下左右对待。您还没有指定一般树是什么(一个猜测是每个节点可以有两个以上的后代,但是,由于转换后的节点节点似乎具有可比性:原始节点有多少个值?以及如何将其转换为二叉树(左侧引用是后代引用,适用于兄弟姐妹?)提供URL可能是合适的。)
结合检查:if (null == focusNode || v == focusNode) return parent;
不要像对parent那样与其有意义的名称相反的变量赋值,然后再在左边重复,而不是传递适当的值:preorderTraversal(bTree.left(focusNode), v, focusNode);
如果你在条件陈述的不同部分以不同的方式进行处理,而没有无可争辩和明显的原因,请发表评论:为什么你在右边重复时传递父母?
(一个用于引用方法注释。请考虑将它们升级到javadoc。)