前序遍历:根左右
中序遍历:左根右
后续遍历:左右根
递归版本,思路比较简单。
//前序遍历
void Tree(tree* root)
{
if(root)
{
cout<<root->data<<endl;
Tree(root->left);
Tree(root->right);
}
}
//中序遍历
void Tree(tree* root)
{
if(root)
{
Tree(root->left);
cout<<root->data<<endl;
Tree(root->right);
}
}
//后序遍历
void Tree(tree* root)
{
if(root)
{
Tree(root->left);
Tree(root->right);
cout<<root->data<<endl;
}
}
非递归版本主要利用栈的先进后出特性,前序和中序较为简单,难点在后续遍历上。
//前序遍历
void Tree(tree* root)
{
tree* p = root;
if(root==NULL) return ;
stack<tree*> s;
while(!s.empty()||p)
{
while(p)
{
s.push(p);
cout<<p->data;
p = p->left;
}
if(!s.empty())
{
p = s.top();
s.pop();
p = p->right;
}
}
}
//中序遍历
void Tree(tree* root)
{
tree* p = root;
if(root==NULL) return ;
stack<