轉載於:https://blog.csdn.net/weixin_42130471/article/details/80319821
方法一:
void PreOrderWithoutRecursion1(BTNode* root)
{
if (root == NULL)
return;
BTNode* p = root;
stack<btnode*> s;
while (!s.empty() || p)
{
//邊遍歷邊打印,並存入棧中,以後需要藉助這些根節點(不要懷疑這種說法哦)進入右子樹
while (p)
{
cout << setw(4) << p->data;
s.push(p);
p = p->lchild;
}
//當p爲空時,說明根和左子樹都遍歷完了,該進入右子樹了
if (!s.empty())
{
p = s.top();
s.pop();
p = p->rchild;
}
}
cout << endl;
}</btnode*>
方法二:
void PreOrderWithoutRecursion2(BTNode* root)
{
if (root == NULL)
return;
BTNode* p = root;
stack<btnode*> s;
while (!s.empty() || p)
{
if (p)
{
cout << setw(4) << p->data;
s.push(p);
p = p->lchild;
}
else
{
p = s.top();
s.pop();
p = p->rchild;
}
}
cout << endl;
}</btnode*>
方法三:
public void preOrderWithoutRecursion(TreeNode T){ //前序遍歷非遞歸算法
TreeNode p;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(T); //先將根節點壓進棧中
while(T!=null&&!stack.empty()){
p = stack.pop(); //彈出棧頂的節點賦給p
System.out.println(p.data); //用輸出來代替對節點的處理
if(p.rchild!=null){
stack.push(p.rchild); //如果彈出節點的右孩子不爲空則壓入棧
} //注意,這裏的重點是一定要先將右孩子壓入棧,再將左孩子壓入
if(p.lchild!=null){
stack.push(p.lchild); //如果彈出節點的左孩子不爲空則壓入棧
}
}
}