先给出二叉树结构
typedef struct BtNode
{
BtNode * lchild;
BtNode * rchild;
Elemtype data;
}BtNode,*BinaryTree;
非递归前序遍历
- 利用一个栈,首先从根节点一直入栈左子树,并不断打印遇到的节点,直到左子树为NULL
- 获取并出栈栈顶元素,对获取到的栈顶元素的右子树做如上操作
- 直到将栈为空,遍历结束
代码如下:
void PreOrder(BtNode *root)
{
stack<BtNode*> st;
if(root==NULL)
{
return;
}
while(root!=NULL||!st.empty())
{
while(root!=NULL)
{
st.push(root);
cout<<root->data<<" ";
root=root->lchild;
}
root=st.top();
st.pop();
root=root->rchild;
}
}
非递归中序遍历
在入栈左子树的过程中不打印所遇到的节点,而是等到出栈的时候再打印。思路如下
- 利用一个栈,首先从根节点一直入栈左子树,直到左子树为NULL。
- 获取并出栈栈顶元素并打印,对获取到的栈顶元素的右子树做如上操作
- 直到将栈为空,遍历结束
void InOrder2(BtNode* root)
{
stack<BtNode*>st;
if(root==NULL)
{
return;
}
while(root!=NULL||!st.empty())
{
while(root)
{
st.push(root);
root=root->lchild;
}
if(!st.empty())
{
root=st.top();
st.pop();
cout<<root->data<<" ";
root=root->rchild;
}
}
}
非递归后序遍历
同样利用栈
void LastOrder2(BtNode*root)
{
stack<BtNode*>st;
BtNode*cur=NULL;
BtNode*per=NULL;
st.push(root);
while(!st.empty())
{
cur=st.top();
if((cur->lchild==NULL&&cur->rchild==NULL)||per!=NULL&&(per==cur->lchild||per==cur->rchild))
{
cout<<cur->data<<" ";
st.pop();
per=cur;
}
else
{
if(cur->lchild!=NULL)
{
st.push(cur->lchild);
}
if(cur->rchild!=NULL)
{
st.push(cur->rchild);
}
}
}
}