我尝试了两种实现,但它们并没有完全发挥作用。
这是我完全坚持的实施之一。
/** 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;
}
这里的问题似乎是它遍历左子树,并更新了正确的父节点,但在返回值时,它总是返回根节点。我似乎不明白为什么会这样。另一个是当遍历正确的子树时,我的父节点总是错误的。请帮忙!
答案 0 :(得分:0)
你在不给出动力的情况下左右对待。您还没有指定一般树是什么(一个猜测是每个节点可以有两个以上的后代,但是,由于转换后的节点节点似乎具有可比性:原始节点有多少个值?以及如何将其转换为二叉树(左侧引用是后代引用,适用于兄弟姐妹?)提供URL可能是合适的。)
结合检查:if (null == focusNode || v == focusNode) return parent;
。
不要像对parent
那样与其有意义的名称相反的变量赋值,然后再在左边重复,而不是传递适当的值:preorderTraversal(bTree.left(focusNode), v, focusNode);
。
如果你在条件陈述的不同部分以不同的方式进行处理,而没有无可争辩和明显的原因,请发表评论:为什么你在右边重复时传递父母?
(一个用于引用方法注释。请考虑将它们升级到javadoc。)