前言:
二叉树的基本遍历方式有三种,分别是前序遍历、中序遍历和后序遍历。
前序遍历,是指父节点在前,左子树其次,右子树在后的遍历方式。
中序遍历,是指左子树在前,父节点其次,右子树在后的遍历方式。
后序遍历,是指左子树在前,右子树其次,父节点在后的遍历方式。
不用死记硬背,都以父节点做基准,其次左子树永远在右子树前。前序遍历为“父->左->右”,中序遍历为“左->父->右”,后序遍历为“左->右->父”。
示例:
以上图为例,其三序遍历结果如下:
前序遍历:a -> b -> c -> d -> e -> f -> g -> h
中序遍历:b -> c -> d -> e -> f -> a -> g -> h
后序遍历:b -> c -> d -> e -> f -> g -> h -> a
实现:
因为每个子树的遍历方式以及遍历效果相同,因此采用递归方式,实现非常简单:
建树的代码可以参考之前文章:
前序遍历的实现:
//前序遍历
void PreOrder(Node *pTree)
{
if(pTree == NULL)
return ;
cout << pTree->data << " -> ";
PreOrder(pTree->left);
PreOrder(pTree->right);
}
中序遍历:
//中序遍历
void MiddleOrder(Node *pTree)
{
if(pTree == NULL)
return ;
PreOrder(pTree->left);
cout << pTree->data << " -> ";
PreOrder(pTree->right);
}
后序遍历:
//后序遍历
void LastOrder(Node *pTree)
{
if(pTree == NULL)
return ;
PreOrder(pTree->left);
PreOrder(pTree->right);
cout << pTree->data << " -> ";
}
源码:
#include <iostream>
#include <list>
using namespace std;
struct Node
{
char data;
Node *left;
Node *right;
};
Node *Create(char **str)
{
Node *s = NULL;
if(str != NULL && *str != NULL && **str != '#')
{
s = new Node;
s->data = **str;
s->left = Create(&++*str);
s->right = Create(&++*str);
}
return s;
}
//前序遍历
void PreOrder(Node *pTree)
{
if(pTree == NULL)
return ;
cout << pTree->data << " -> ";
PreOrder(pTree->left);
PreOrder(pTree->right);
}
//中序遍历
void MiddleOrder(Node *pTree)
{
if(pTree == NULL)
return ;
PreOrder(pTree->left);
cout << pTree->data << " -> ";
PreOrder(pTree->right);
}
//后序遍历
void LastOrder(Node *pTree)
{
if(pTree == NULL)
return ;
PreOrder(pTree->left);
PreOrder(pTree->right);
cout << pTree->data << " -> ";
}
int main()
{
char *str = "abc##de##f##g#h##";
Node *p = Create(&str);
PreOrder(p);
cout << endl;
MiddleOrder(p);
cout << endl;
LastOrder(p);
cout << endl;
}
欢迎关注我的个人公众号【头发头发等等我】
验证:
运行截图: