Java 二叉搜索树,按顺序迭代法不起作用

Java 二叉搜索树,按顺序迭代法不起作用,java,tree,binary-search-tree,Java,Tree,Binary Search Tree,我目前正在大学上一门数据结构课,我们正在学习使用链表的二进制搜索树。我们已经递归地讨论了inoder方法,但我想尝试迭代地执行该方法。经过一些研究之后,我意识到我必须在遍历树时使用堆栈。我能够得到树最左边的末端,但是向后遍历树是我遇到麻烦的地方。我尝试过我的代码的各种版本,但我总是以零指针异常结束,或者它打印出了错误 public void inOrder(){ // implement this method using non-recursive so

我目前正在大学上一门数据结构课,我们正在学习使用链表的二进制搜索树。我们已经递归地讨论了inoder方法,但我想尝试迭代地执行该方法。经过一些研究之后,我意识到我必须在遍历树时使用堆栈。我能够得到树最左边的末端,但是向后遍历树是我遇到麻烦的地方。我尝试过我的代码的各种版本,但我总是以零指针异常结束,或者它打印出了错误

public void inOrder(){                
    // implement this method using non-recursive solution
   if(m_root==null){
      return;
   }
   Stack<BSTNode> myStack= new Stack<BSTNode>();
   BSTNode current=m_root;
   while (current!= null){
      myStack.push(current);
      current=current.getLeft();
   }
   while (current!=null&& !myStack.isEmpty()){
      current=myStack.peek();
      System.out.print(current.getInfo()+" ");
      myStack.pop();
      if(current.getRight()!=null){
          myStack.push(current);
      }

   }

}
public void inoorder(){
//使用非递归解决方案实现此方法
if(m_root==null){
返回;
}
Stack myStack=新堆栈();
BST节点电流=m_根;
while(当前!=null){
myStack.push(当前);
current=current.getLeft();
}
while(current!=null&&!myStack.isEmpty()){
当前=myStack.peek();
System.out.print(current.getInfo()+);
myStack.pop();
if(current.getRight()!=null){
myStack.push(当前);
}
}
}

首先,您的代码中有两个主要缺陷:第一个while循环的电流指向null,因此您永远不会进入第二个while循环。而且我觉得这个

if(current.getRight()!=null){
      myStack.push(current);
  }
应使用myStack.push(current.getRight())进行更正,否则,您将尝试一次又一次地推送弹出的元素,并将进入一个无休止的循环。但即便如此,探索的逻辑也是错误的,因为你永远不会走到从右链接到达的节点的左边。 我试图从您的代码开始创建一个工作顺序遍历:

public void inOrder(){                

   Stack<BSTNode> myStack= new Stack<BSTNode>();
   Set<BSTNode> visited = new HashSet<BSTNode>();
   BSTNode current = m_root;
   if(current!= null)
       myStack.push(current);
   while (!myStack.isEmpty()){
      current = myStack.peek();
      if(current.getLeft()!= null && !visited.contains(current.getLeft()))
          myStack.push(current.getLeft());
      else{
          //here you explore the parent node
          System.out.print(current.getInfo()+" ");
          visited.add(current);
          myStack.pop();
          //and then you see if it has children on the right
          if(current.getRight()!=null && !visited.contains(current.getRight))
              myStack.push(current.getRight());

      }
   }

}
public void inoorder(){
Stack myStack=新堆栈();
Set visted=新HashSet();
BST节点电流=m_根;
如果(当前!=null)
myStack.push(当前);
而(!myStack.isEmpty()){
当前=myStack.peek();
if(current.getLeft()!=null&&!visted.contains(current.getLeft()))
push(current.getLeft());
否则{
//在这里,您将探索父节点
System.out.print(current.getInfo()+);
已访问。添加(当前);
myStack.pop();
//然后你看看右边有没有孩子
if(current.getRight()!=null&&!visted.contains(current.getRight))
push(current.getRight());
}
}
}

从我看到的第二个while循环中的代码存在一些问题。你的想法是正确的,但是有一些逻辑错误。你的条件是正确的,但不应该在一起,它们应该分开。下面的代码实现了您想要的功能

public void inOrder(){                
    // implement this method using non-recursive solution
   if(m_root==null){
      return;
   }
   Stack<BSTNode> myStack= new Stack<BSTNode>();
   BSTNode current=m_root;
   while (current!= null){
      myStack.push(current);
      current=current.getLeft();
   }
   while (!myStack.isEmpty()){
      current=(BSTNode)myStack.pop();
      System.out.print(current.getInfo()+" ");
      if(current.getRight() != null){
         current=current.getRight();
         while (current!= null){
            myStack.push(current);
            current=current.getLeft();
         }
      }
   }

}
public void inoorder(){
//使用非递归解决方案实现此方法
if(m_root==null){
返回;
}
Stack myStack=新堆栈();
BST节点电流=m_根;
while(当前!=null){
myStack.push(当前);
current=current.getLeft();
}
而(!myStack.isEmpty()){
当前=(BSTNode)myStack.pop();
System.out.print(current.getInfo()+);
if(current.getRight()!=null){
current=current.getRight();
while(当前!=null){
myStack.push(当前);
current=current.getLeft();
}
}
}
}