一,中序遍历
void inOrder(BinTree *root)
{
stack<BinTree*>s;//用一个栈;
BinTree *p=root;//当前的p指针指向根节点;
while(p!=NULL||!s.empty())//如果p为空就进行if语句,如果p不为空就进行while语句让p为空
//如果p为空时进行if语句发现栈为空,说明该循环要结束了,所有的节点都遍历完了。对吗?
{
while(p!=NULL)//一直往左走把到NULL之前的所有的节点压入栈;
{
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();//取栈顶;
cout<<p->data<<" ";//因为这是最左边的一个点,所以要输出喽;
s.pop();//输出完之后把栈顶的元素pop掉,但是此时p仍然指向未pop掉时栈顶;
p=p->rchild;//因为左孩子为NULL,根节点访问过了,所以把p指向p的右孩子;
}
}
}
二,先序遍历
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*>