前序遍历:
操作顺序为:父节点 -> 左儿子 -> 右儿子
递归版本
struct node
{
int data;
struct node * left;
struct node * right;
};
void preOrder(node *root)
{
if(root != NULL)
{
cout<<root->data<<" ";
preOrder(root->left);
preOrder(root->right);
}
}
非递归版本
void preOrderStack(node *root)
{
stack<node *> s;
while(root != NULL || !s.empty())
{
if(root != NULL)
{
cout<<root->data<<" ";
s.push(root);
root = root->left;
}
else
{
root = s.top();
s.pop();
root = root->right;
}
}
}
中序遍历:
操作顺序为:左儿子 -> 父节点 -> 右儿子
递归版本
void midOrder(node *root)
{
if(root != NULL)
{
midOrder(root->left);
cout<<root->data<<" ";
midOrder(root->right);
}
}
非递归版本
void midOrderStack(node *root)
{
stack<node *> s;
while(root != NULL || !s.empty())
{
if(root != NULL)
{
s.push(root);
root = root->left;
}
else
{
root = s.top();
s.pop();
cout<<root->data<<" ";
root = root->right;
}
}
}
后序遍历:
操作顺序为:左儿子 -> 右儿子 -> 父节点
递归版本
void postOrder(node *root)
{
if(root != NULL)
{
postOrder(root->left);
postOrder(root->right);
cout<<root->data<<" ";
}
}
非递归版本
void postOrderStack(node *root)
{
stack<node *> s;
node *cur;
node *pre = NULL;
s.push(root);
while(!s.empty())
{
cur = s.top();
if((cur->left == NULL && cur->right == NULL) || (pre != NULL && (cur->left == pre || cur->right == pre)))
{
cout<<cur->data<<" ";
pre = cur;
s.pop();
}
else
{
if(cur->right != NULL)
s.push(cur->right);
if(cur->left != NULL)
s.push(cur->left);
}
}
}