使用Stack的二叉搜索树的Inorder Tree Traversal算法

时间:2012-10-03 01:04:49

标签: java stack binary-search-tree inorder

我的输入结果为24, 4, 2, 3, 9, 10, 32,我得到的结果为2, 3, 4, 24

我正在使用堆栈。当我手动检查了这个程序时,即使有正确的子树,节点也不会在堆栈上的4处经过else if

public void inorderNonRcursive(Node root){

    Stack s = new Stack();
    Node node = root;
    Node k;
    int c=0;

    if(node != null) {
        s.push(node);    
    }

    while(!s.stack.isEmpty()) {   

        //node=(Node) s.stack.get(s.stack.size()-1);
        System.out.println("first condition" + (node.getleft() != null && (node.getVisited() == false)) + "second condi" + (node.getRight() != null));

        if(node.getleft() != null && (node.getVisited() == false)) {
            node = node.getleft();
            s.push(node);
            System.out.println("   from 1           "+(++c)); 

        } else if(node.getRight() != null) {
            k = s.pop();
            System.out.println(k.getvalue());
            node=node.getRight();
            s.push(node);
            System.out.println("    from 2          "+(++c)); 

        } else {
            k = s.pop();
            System.out.println(k.getvalue());
            System.out.println("        from 3      "+(++c)); 
        }  

    }

}

2 个答案:

答案 0 :(得分:9)

对我而言,设计中存在两个问题:

  1. 该算法似乎是适合迭代的递归算法和
  2. Node班级知道被访问。
  3. 这是一个不同的解决方案(你需要稍微调整一下):

    // Inorder traversal:
    // Keep the nodes in the path that are waiting to be visited
    Stack s = new Stack(); 
    // The first node to be visited is the leftmost
    Node node = root;
    while (node != null)
    {
        s.push(node);
        node = node.left;
    }
    // Traverse the tree
    while (s.size() > 0)
    {
        // Visit the top node
        node = (Node)s.pop();
        System.out.println((String)node.data);
        // Find the next node
        if (node.right != null)
        {
            node = node.right;
            // The next node to be visited is the leftmost
            while (node != null)
            {
                s.push(node);
                node = node.left;
            }
        }
    }
    

    回到我的第一条评论,你不是说你写了伪代码并测试了它。我认为这是编写新算法的关键步骤。

答案 1 :(得分:3)

这看起来像是一个课堂练习,旨在帮助您理解二叉树。

在编写任何代码之前,绘制树的图片,每个节点都有一个值,例如“A”,“B”,“C”等。然后从根节点开始,看看你需要什么要按顺序访问每个节点。写下您在伪代码中学到的知识,并通过执行它所说的来测试它。确保测试每个节点可以考虑的所有不同情况(您应该至少有三个)。在树中放置七个节点。

现在您可以开始使用代码了。输入您的伪代码作为注释,然后在每个注释之间插入Java代码。

享受: - )