二叉树遍历的非递归版本除了可以使用 stack 外, 见 http://blog.csdn.net/shoulinjun/article/details/19089155
还可以采用 parent 指针和标记来实现。
二叉树节点的数据结构如下:
/**
* struct TreeNode
* {
* char value;
* TreeNode *parent;
* TreeNode *left_child;
* TreeNode *right_child;
* bool visited; //标记是否已访问
* };
*/
前序遍历:
void PreOrderVisitNoStack(TreeNode * root)//非递归,不用栈
{
while(root != NULL)
{
if(!root->visited){
cout << root->value << " ";
root->visited = true;
}
while(root->left_child && !root->left_child->visited)
{
root = root->left_child;
cout << root->value << " ";
root->visited = true;
}
if(root->right_child !=NULL && !root->right_child->visited)
{
root = root->right_child;
}
else
root = root->parent;
}
}
中序遍历:
void InOrderVisitNoStack(TreeNode * root)
{
while(root != NULL)
{
while(root->left_child && !root->left_child->visited)
{
root = root->left_child;
}
if(!root->visited)
{
cout << root->value << " ";
root->visited = true;
}
if(root->right_child !=NULL && !root->right_child->visited)
{
root = root->right_child;
}
else
root = root->parent;
}
}
后序遍历:
void PostOrderVisitNoStack(TreeNode *root)
{
while(root)
{
while(root->left_child && !root->left_child->visited){
root = root->left_child;
}
//右子树未访问
if(root->right_child && !root->right_child->visited){
root = root->right_child;
}
else{
cout << root->value << " ";
root->visited = true;
root = root->parent;
}
}
}