我们都知道递归是我们使用系统帮我们维护了一个栈,非递归你就得自己维护一个stack
1.前序遍历 根左右
void PreOrder(NODE *Head)
{
stack<NODE *> s;
s.push(Head);//先把头结点压入进去
//当栈不空的时候
while(!s.empty())
{
//取出头结点
NODE *pTemp = s.top();
s.pop();
//直接打印 value
cout<<pTemp->Value<<" ";
//先压入右节点
if(pTemp->Right)
s.push(pTemp->Right);
//在压入左节点
if(pTemp->Left)
s.push(pTemp->Left);
}
cout<<endl;
}
2.中序遍历 左根右
void InOrder(NODE *Head)
{
stack<NODE *> s;
NODE *pTemp = Head;
while(!s.empty() || NULL != pTemp)
{
//直接一路压入到最深的那个左节点
if(NULL != pTemp)
{
s.push(pTemp);
pTemp = pTemp->Left;
}
else
//当执行到这一步的时候 可以确保栈顶的那个节点的左节点已经被访问玩了
{
//取出栈顶节点
pTemp = s.top();
s.pop();
//输出根的值
cout<<pTemp->Value<<" ";
//循环右子树
pTemp = pTemp->Right;
}
}
cout<<endl;
}
3.后续遍历 左右根
前序是根左右 --> 根右左–>在用另外一个栈 将根右左变成左右根
void PosOrder(NODE *Head)
{
stack<NODE *> s;
stack<int> p;
s.push(Head);
while(!s.empty())
{
NODE *pTemp = s.top();
s.pop();
p.push(pTemp->Value);
if(pTemp->Left)
s.push(pTemp->Left);
if(pTemp->Right)
s.push(pTemp->Right);
}
while(!p.empty())
{
cout<<p.top()<<" ";
p.pop();
}
cout<<endl;
}