Java 基于堆栈的二叉搜索树的有序树遍历算法

Java 基于堆栈的二叉搜索树的有序树遍历算法,java,stack,binary-search-tree,inorder,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

我的输入结果是
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)); 
        }  

    }

}

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

在编写任何代码之前,先绘制一张树的图片,每个节点上都有一个值,如“a”、“B”、“C”等。然后从根节点开始,查看需要执行哪些操作才能按顺序访问每个节点。用伪代码编写您所学的内容,并按照它所说的内容进行测试。确保测试每个节点可以想到的所有不同情况(至少应该有三个)。在树中放置大约七个节点

现在可以开始编写代码了。键入伪代码作为注释,然后在每个注释之间插入Java代码


享受:-)

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

在编写任何代码之前,先绘制一张树的图片,每个节点上都有一个值,如“a”、“B”、“C”等。然后从根节点开始,查看需要执行哪些操作才能按顺序访问每个节点。用伪代码编写您所学的内容,并按照它所说的内容进行测试。确保测试每个节点可以想到的所有不同情况(至少应该有三个)。在树中放置大约七个节点

现在可以开始编写代码了。键入伪代码作为注释,然后在每个注释之间插入Java代码


享受:-)

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

  • 该算法似乎是适合于迭代和迭代的递归算法
  • 节点
    类知道被访问的情况 这里有一个不同的解决方案(您需要稍微调整):


    回到我的第一条评论,您不会说您编写了伪代码并对其进行了测试。我认为这是编写新算法的关键一步

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

  • 该算法似乎是适合于迭代和迭代的递归算法
  • 节点
    类知道被访问的情况 这里有一个不同的解决方案(您需要稍微调整):


    回到我的第一条评论,您不会说您编写了伪代码并对其进行了测试。我认为这是编写新算法的关键一步

    你能发布你的
    节点
    类的代码吗?你能发布你的
    节点
    类的代码吗?谢谢你的建议,但这不是xlass练习,我已经用节点圈和一步一步地通过测试了,我还打印了每一次迭代的条件,以了解实际发生的情况。实际问题是,对于4个节点,我有一个正确的节点9,即使它有一个正确的节点,但它不接受第二个条件,即我检查的正确节点为true。在我开始这项工作之前,我还实施了累进法,这给了我完美的答案。谢谢你的建议,但这不是xlass练习,我已经使用节点圆和一步一步地通过测试了它,我还打印了每一次迭代的条件,以了解实际发生的情况。实际问题是我有一个右节点9表示4节点,即使它有一个右节点,但它不接受第二个条件,即我正在检查右节点是否为true。在我开始这项工作之前,我还实施了接收方法,这给了我完美的答案。
    // 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;
            }
        }
    }