前序遍历
方法一:
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); //如果弹出节点的左孩子不为空则压入栈
}
}
}