【问题标题】:inorder iterator for binary tree - java二叉树的中序迭代器 - java
【发布时间】:2016-02-20 16:42:23
【问题描述】:

这是我的节点类:

private class Node {
    private int key;         // the key field
    private Object data;     // the rest of the data item
    private Node left;       // reference to the left child/subtree
    private Node right;      // reference to the right child/subtree
    private Node parent;     // reference to the parent

..等等。

这是带有 next() 和 hasNext() 方法的中序迭代器:

private class inorderIterator implements LinkedTreeIterator {

    private Node nextNode;

    private inorderIterator() {
        // The traversal starts with the root node.
        nextNode = root;
        if(nextNode == null)
           return;
        while (nextNode.left != null)
           nextNode = nextNode.left;
    }

    public boolean hasNext() {
        return (nextNode != null);
    }

    public int next() {
        if(!hasNext()) 
            throw new NoSuchElementException();             

        Node r = nextNode;

        if (nextNode.right != null) {
            nextNode = nextNode.right;

            while (nextNode.left != null) {
                nextNode = nextNode.left;
            }

            return r.key;
        } else while (true) {
            if (nextNode.parent == null) {
                nextNode = null;
                return r.key;
            }

            if (nextNode.parent.left == nextNode) {          
                nextNode = nextNode.parent;
                return r.key;    
            }

            nextNode = nextNode.parent;                   
        }            
        return r.key; 
    }
}

问题是,它只打印左子树上的左节点。 例如,对于具有根节点 17、左节点 15 和右节点 19 的树,它只打印 15。
所以它永远不会进入右子树。

我猜问题出在else while (true) 部分,但我不知道如何解决这个问题。

【问题讨论】:

  • 您是否尝试过使用调试器逐步查看它在做什么?

标签: java iterator binary-tree parent inorder


【解决方案1】:

您可以尝试递归方法。

类似:

public void printTreeInOrder(Node node){
   if(node.left != null){
      printTree(node.left);
   }
   System.out.println(node.key);
   if(node.right != null){
      printTree(node.right);
   } 
}

如果您将此方法传递给根节点,它应该会为您打印出整个树。

我希望这会有所帮助。

最好的。

【讨论】:

  • 为了有序,打印实际上应该在两个递归调用之间,而不是在末尾。
  • 对。为了......改变它。
【解决方案2】:

原来我的节点的父字段没有正确更新。修复后,迭代器就可以正常工作了。

【讨论】:

  • 如果您能够回答自己的问题,您应该为社区发布修改后的代码或删除问题...
  • @MichaelQuatrani 我认为他发布的内容没有修改代码。这是他的树创建过程中的一个问题,他没有在这里展示。
  • @brimborium 对。这就是为什么我建议他在答案中发布一些修改过的代码,否则,它并不能真正帮助社区。​​span>
【解决方案3】:

我会在这个辅助方法中使用堆栈:

Node advance_to_min(Node r)
  {
    while (r.left != null)
      {
        s.push(r);
        r = r.left;
      }
    return r;
  }

第一个节点顺序是通过在根上调用此方法给出的。比如:

curr = advance_to_min(curr);

然后我会这样实现next()

void next()
  {
    curr = curr.right;
    if (curr != null)
      {
        curr = advance_to_min(curr);
        return;
      }

    if (s.is_empty())
      curr = null;
    else
      curr = s.pop();
  }

curr 和堆栈 s 将是迭代器属性。 curr 将指向中序序列中的当前节点。

最坏情况下每个next()调用的成本O(lg n)(如果树趋于平衡)并且该方法不需要父指针;因此,它与使用父指针具有相同的空间成本,但仅在最坏的情况下

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多