1.前序非递归:
二叉树的非递归前序遍历,前序遍历思想:先让根进栈,只要栈不为空,就可以做弹出操作,
每次弹出一个结点,记得把它的左右结点都进栈,记得右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。
*/
void PreOrder_Nonrecursive(BiTree T) //先序遍历的非递归
{
if(!T)
return ;
stack<BiTree> s;
s.push(T);
while(!s.empty())
{
BiTree temp = s.top();
cout<<temp->data<<" ";
s.pop();
if(temp->rchild)
s.push(temp->rchild);
if(temp->lchild)
s.push(temp->lchild);
}
}
- void InOrderTraverse(BiTree T) // 中序遍历的非递归
- {
- if(!T)
- return ;
- stack<BiTree> s;
- BiTree curr = T->lchild; // 指向当前要检查的节点
- s.push(T);
- while(curr != NULL || !s.empty())
- {
- while(curr != NULL) // 一直向左走
- {
- s.push(curr);
- curr = curr->lchild;
- }
- curr = s.top();
- s.pop();
- cout<<curr->data<<" ";
- curr = curr->rchild;
- }
- }
- void PostOrder_Nonrecursive(BiTree T) // 后序遍历的非递归 双栈法
- {
- stack<BiTree> s1 , s2;
- BiTree curr ; // 指向当前要检查的节点
- s1.push(T);
- while(!s1.empty()) // 栈空时结束
- {
- curr = s1.top();
- s1.pop();
- s2.push(curr);
- if(curr->lchild)
- s1.push(curr->lchild);
- if(curr->rchild)
- s1.push(curr->rchild);
- }
- while(!s2.empty())
- {
- printf("%c ", s2.top()->data);
- s2.pop();
- }
- }
4. 层序遍历
- int visit(BiTree T)
- {
- if(T)
- {
- printf("%c ",T->data);
- return 1;
- }
- else
- return 0;
- }
- void LeverTraverse(BiTree T) //方法一、非递归层次遍历二叉树
- {
- queue <BiTree> Q;
- BiTree p;
- p = T;
- if(visit(p)==1)
- Q.push(p);
- while(!Q.empty())
- {
- p = Q.front();
- Q.pop();
- if(visit(p->lchild) == 1)
- Q.push(p->lchild);
- if(visit(p->rchild) == 1)
- Q.push(p->rchild);
- }
- }