序树遍历算法二叉搜索树使用堆栈(Inorder Tree Traversal algorithm f

2019-10-17 07:08发布

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

我使用的堆栈 。 当我手工检查这个程序的节点不是通过去else if在4堆栈,即使有右子树。

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)); 
        }  

    }

}

Answer 1:

对我来说,在设计两个问题:

  1. 该算法似乎是递归一个适合迭代
  2. Node类知道被访问。

这里是一个不同的解决方案(你需要去适应它了一下):

// 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;
        }
    }
}

回到我的第一个意见参考,你不说你写的伪代码和测试它。 我想,这在编写新算法的关键一步。



Answer 2:

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

在你编写任何代码,你的画树的图片,在每个节点的值,如“A”,“B”,“C”等,然后由根节点开始,看你需要做什么访问每个节点的顺序。 写你在伪代码已经学会了,这样做它说什么测试。 请确保您测试所有你能想到的每一个节点(你应该有至少三种)不同的情况。 把约七节点在你的树。

现在你可以在你的代码开始。 输入您的伪代码注释,然后插入您的Java代码中的每个注释之间。

请享用 :-)



文章来源: Inorder Tree Traversal algorithm for a Binary Search Tree using Stack