我想仅使用一个堆栈对二叉树进行后序遍历。这是我的代码,首先我将左侧元素推入堆栈,直到达到 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;
}
}
}
这是我回答另一个问题的代码(无递归的二叉树后序遍历)。它适用于一个堆栈,并且不使用已访问标志。
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);
}
}
}
}
为什么不递归地进行呢?
public void postorder(BinNode root) {
if (root == null)
return;
postorder(root.getLeft());
postorder(root.getRight());
System.out.println(root.getKey());
}
此代码中有一个无限循环,让我们考虑右偏树来说明这一点:
1 有一个右孩子 2
2 有一个右孩子 3
3 是叶节点
在前 3 个循环中,1、2、3 将被推入堆栈。 现在在第四个循环中,它进入 else 部分,现在它打印 3,然后打印 2 并弹出两者。
声明之后
else if( s.top().getRight()==null)
声明
if(!s.isEmpty())
将再次将 2 压入堆栈。这会导致无限循环。
代码有缺陷。
声明
if(root==s.top().getRight())
应该变成一个 while 循环来解决这个问题。
这是我的代码
const ans = []
const stack = []
var cur = root
while (cur) {
ans.push(cur.val)
stack.push(cur)
cur = cur.right
}
while (stack.length) {
cur = cur.pop()
if (cur.left) {
cur = cur.left
while (cur) {
ans.push(cur.val)
cur = cur.right
}
}
}
return ans.reverse()