Резьбовое дерево предзаказ путевой в Яве
Я пытаюсь написать код для обхода предзаказа бинарного дерева с резьбой в Java. Я написал следующий код, и он подходит для нескольких примеров, но я боюсь, что пропускаю некоторые крайние сценарии.
Дополнительная информация Узел имеет две ссылки слева и справа, указывающие на левого и правого дочернего узла соответственно. Логическое поле с именем successor определяет, указывает ли правый указатель на дочерний элемент или преемник в соответствии с обходом inorder (если successor==false: правый указывает на дочерний элемент, иначе указывает на преемник обхода inorder)
Было бы очень признательно, если бы кто-то мог указать на недостатки в моей логике здесь...
public void threadedPreorder(){
IntThreadedTreeNode prev, p=root; //pointers to binary tree nodes
while(p!=null){
while(p.left!=null){ //traversal to leftmost node
visit(p); //while visiting it
p=p.left;
}
visit(p);
prev=p;
p=p.right; //shift to right or successor
if(p!=null && prev.successor){ //avoid visiting the same node twice
while(p!=null && prev.successor){
prev=p;
p=p.right;
}
}
}
}
Любая помощь будет оценена...:)
2 ответа
Перво-наперво... Вы должны написать модульные тесты, чтобы найти функциональные ошибки
Однако у вас, похоже, здесь есть ошибка... хотя цикл не выполняется вообще
if(p!=null && prev.successor){
while(p!=null && !prev.successor){
prev=p;
p=p.right;
}
}
Вы можете заменить его на do-while
public class ParcelBST extends BinarySearchTree<Parcel> implements Iterable<Parcel> {
public ParcelBST(Parcel value, ParcelBST leftNode, ParcelBST rightNode) {
super(value, leftNode, rightNode);
}
public ParcelBST(BinarySearchTree<Parcel> parcelBST) {
//这里写了root是value
super(parcelBST.value,parcelBST.leftNode,parcelBST.rightNode);
}
public ParcelBST(Tree<Parcel> parcelTree) {
super(parcelTree.value,parcelTree.leftNode,parcelTree.rightNode);
}
public ParcelBST(Parcel value) {
super(value);
}
@Override
public Iterator<Parcel> iterator() {
return new IteratorPreOrder();
}
class IteratorPreOrder implements Iterator<Parcel> {
// Hint: value, left/right sub-trees can be accessed by:
// ParcelBST.this.value ParcelBST.this.leftNode ParcelBST.this.rightNode
// Or equivalently directly:
// value leftNode rightNode
private Deque<BinarySearchTree<Parcel>> stack = new LinkedList<>();
// You may add methods and variables here if you wish
//这个方法是干什么?
public IteratorPreOrder() {
//初始preorder的迭代器
// You may add code here if you wish
//为什么要用外部类?
//检查的有没有根节点,如果根节点
if(ParcelBST.this.value != null){
stack.push(ParcelBST.this);
}
}
//在这个迭代器里,再去写方法
@Override
public boolean hasNext() {
// TODO
// START YOUR CODE
//是用来判断stack里有没有东西的
if(stack.isEmpty()){
return false;
}
return true;
// END YOUR CODE
}
@Override
//这个方法是为了去迭代树
public Parcel next() {
// TODO
// START YOUR CODE
if (!hasNext()) {
throw new NoSuchElementException();
}
BinarySearchTree<Parcel> current = stack.pop();
//right
if (current.rightNode != null && current.rightNode.value != null) {
stack.push((BinarySearchTree<Parcel>) current.rightNode);
}
//left
if (current.leftNode != null && current.leftNode.value != null) {
stack.push((BinarySearchTree<Parcel>) current.leftNode);
}
// END YOUR CODE
//返回整个curren的value
return current.value;
}
}
}