我想在java中创建一个可逆迭代器,它假设在反向和前向运行二叉树。病了,但向上指示,到目前为止我做了什么。
路线
能够找到下一个节点(有序 继承人)或前一个节点( 从当前开始 节点。要找到下一个节点,有 两个案例。
当前节点有一个正确的孩子。在 这种情况下,下一个节点是 右侧的最小节点。任何 当前节点的祖先会 或者有一个较小的值或一个 比任何节点上的值都大 右侧(左侧) 物)。
在这种情况下,下一个节点可以是 发现如下。首先将节点设置为 current.right,然后当node.left是 not null,将节点设置为node.left。后 循环结束,旁边设置 节点。
当前节点没有权利 儿童。在这种情况下,下一个节点是 将成为当前的祖先 节点。当前节点可能是a 其父权的右子,所以代码 需要继续上升父母 字段,直到它上升左链接。它 可能是当前节点 树的最大值,所以下一个 节点可能为null。
在这种情况下,下一个节点可以是 发现如下。首先设置孩子 当前和设置父级到 current.parent。虽然父母不是 null和child == parent.right,set child to parent并将parent设置为 parent.parent。在while循环之后, 在父母旁边设置。
查找上一个节点是 对称的。在上面的描述中, 左右开关(和开关 “最小”,“最大”)。
对于iterator()方法,第一个 调用下一个方法应该返回 树的最小元素。对于 迭代器(T start)方法, 首先应该调用下一个方法 返回最小的元素 大于或等于开始。
// Returns an iterator over all the elements
public ReversibleIterator<T> iterator() {
PublicBTNode<T> current = root;
if(size==0)
return null;
if(current.right!=null){
current.right=current;
while(current.left!=null){
current.left=current;
}
}
return (ReversibleIterator<T>) new RIForLinkedList<T>(list);
}
// return an Iterator that starts with the first element
// that is greater than or equal to start
public ReversibleIterator<T> iterator(T start) {
return null;
}
我认为我的迭代器是错误的,因为我对此有一些限制。:
限制
SortedBST类和任何ReversibleIterator类不应使用数组或ArrayLists。应该在不创建新数组,ArrayLists或节点的情况下执行迭代。
但是我的迭代器
enter code herepublic void iterator(PublicBTNode<T> node, ArrayList<T> list) {
if (node == null)
return;
iterator(node.left, list);
list.add(node.element);
iterator(node.right, list);
}
答案 0 :(得分:1)
此代码看起来不对:
if(current.right!=null){
current.right=current;
while(current.left!=null){
current.left=current;
}
}
我认为应该更像这样:
while(current.left!=null){
current=current.left;
}
此处不需要的current.right
部分。
但重要的是你的迭代器的实现,我们没有看到。