深度优先,广度优先的非递归实现简单,但是树遍历非递归还是有点问题。
特记录如下,代码大概就是这个意思,不保证代码能编译通过。
中序的非递归实现
void no_recur_InorderTraverse(TreeNode *root)
{
stack<TreeNode *> s;
TreeNode *cur=root;
while(!s.empty() || cur!=NULL)
{
while(cur!=NULL)
{
s.push_back(cur);
cur=cur->left;
}
if(!s.empty())
{
cur=s.pop_back();
printf("%d",cur->val);
cur=cur->right;
}
}
}
后序的非递归实现
void no_recur_PostorderTraverse(TreeNode *root)
{
stack<TreeNode *> s;
int sign;
TreeNode *cur=root;
TreeNode *prev;
do
{
while(cur!=NULL)
{
s.push_back(cur);
cur=cur->left;
}
sign=1;
prev=NULL;
while(!s.empty())
{
cur=s.pop_back();
if(cur->right==prev)
{
prev=cur;
}
else
{
cur=cur->right;
sign=0;
}
}
}while(!s.empty());
}