【发布时间】:2012-03-16 20:45:01
【问题描述】:
这里是前序遍历的迭代版本。想法是
将根推入堆栈。
如果左孩子不是 NULL。推左孩子和 root=root->left
Else root=Top of stack;Pop;push它的右孩子和root=root->right
它在一些树上工作,但对于一些输入树,它打印一个重复的值。堆栈的行为令人惊讶。它如何从 (4 5 6 8) 变为 (4 6 8)?
void preorder(node* root)
{stack<node*> st;
st.push(root);
cout<<root->val<<" \n ";
while(!st.empty())
{if(root->left!=NULL)
{st.push(root->left);
cout<<st.top()->val<<" ";
// printstack(st);
root=root->left;
}
else{root=st.top();
st.pop();
if(root->right!=NULL)
{st.push(root->right);
cout<<st.top()->val<<" ";
//printstack(st);
root=root->right;
}
}
}
}
用于调试的辅助函数 printstack
void printstack(stack<node*> s)
{stack<node*> t;
t=s;
while(!t.empty())
{cout<<t.top()->val<<" ";
t.pop();
}
}
对于这个输入树,打印的堆栈在下面。
预购输出为
8 3 1 6 5 4 4 7 9
______8_ / \ __3_ 9 / \ 1 ___6 / \ 5 7 / 4
3 8
1 3 8
6 8
5 6 8
4 5 6 8
4 6 8 //4的栈顶怎么样??本来应该是5,栈是(5 6 8)
7 8
9
【问题讨论】:
标签: c++ algorithm binary-tree