使用一个堆栈在二叉树中遍历订单遍历

时间:2013-12-24 12:40:20

标签: java data-structures binary-tree tree-traversal

我想仅使用一个堆栈对二叉树进行后期遍历。这是我的代码,首先我将左边的元素推入堆栈直到我达到null。然后我弹出一个元素,检查弹出元素和当前堆栈顶部的右元素是否相同。但不知何故,这将进入无限循环。你能告诉我为什么吗?

public void postorderonestack(BinNode root)
{
    BinStack s=new BinStack();

    while(true)
    {
        if(root!=null)
        {
           s.push(root);
           root=root.getLeft();
        }
        else
        {
            if(s.isEmpty())
            {
                System.out.println("Stack is Empty");
                return;
            }

            else if( s.top().getRight()==null)
            {
                root=s.pop();
                System.out.println(root.getKey());

                if(root==s.top().getRight())
                {
                   System.out.print(s.top().getKey());
                   s.pop();
                }
            }

            if(!s.isEmpty())
              root=s.top().getRight();

           else root=null;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

为什么不递归呢?

public void postorder(BinNode root) {
    if (root == null)
        return;
    postorder(root.getLeft());
    postorder(root.getRight());
    System.out.println(root.getKey());
}

答案 1 :(得分:1)

这是我对另一个问题(Post order traversal of binary tree without recursion)的回答的代码。它适用于一个堆栈,不使用访问标记。

private void postorder(Node head) {
  if (head == null) {
    return;
  }
  LinkedList<Node> stack = new LinkedList<Node>();
  stack.push(head);

  while (!stack.isEmpty()) {
    Node next = stack.peek();

    if (next.right == head || next.left == head ||
        (next.left == null && next.right == null)) {
      stack.pop();
      System.out.println(next.value);
      head = next;
    }
    else {
      if (next.right != null) {
        stack.push(next.right);
      }
      if (next.left != null) {
        stack.push(next.left);
      }
    }
  }
}

答案 2 :(得分:0)

这个代码中有一个无限循环让我们考虑一个右倾斜的树来说明这个:

1有一个正确的孩子2

2有一个正确的孩子3

3是叶节点

在前3个循环中,1跟随2跟随3将被推到堆栈。 现在在第四个循环上它进入其他部分现在它打印3然后是2并弹出两个。

之后

else if( s.top().getRight()==null) 

声明

if(!s.isEmpty()) 

将在堆栈上再次推送2。这会导致无限循环。

代码存在缺陷。

声明

if(root==s.top().getRight()) 

应该成为修复此问题的while循环。