二叉树的遍历有先序、中序、后序三种遍历方式,下面一一介绍遍历算法并给出递归遍历的实现。
1、定义二叉树结点的数据结构
我们使用Node结构体定义二叉树的每一个节点,如下:
typedef struct Node
{
//数据
char data;
//左孩子指针
struct Node *LChild;
//右孩子指针
struct Node *RChild;
}BiTNode, *BiTree; //变量列表
2、创建一棵二叉树
通过读入一串字符串,创建一棵二叉树的算法如下:(可使用例子ABC##DE#G##F###来创建)
int creatBinaryTree(BiTree &root)
{
char data;
//先序输入二叉树的一个结点(字符),‘#’表示空树
scanf("%c", &data);
if(data == '#')
{
root = NULL;
}
else
{
//申请空间存放结点
root = (BiTree)malloc(sizeof(Node));
//生成根节点
root->data = data;
//构造左子树
creatBinaryTree(root->LChild);
//构造右子树
creatBinaryTree(root->RChild);
}
return 0;
}
3、先序遍历:
- 先访问根
- 再访问左子树
- 最后访问右子树
void PreorderTraverse(BiTree root)
{
if(root != NULL)
{
visit(root);
PreorderTraverse(root->LChild);
PreorderTraverse(root->RChild);
}
}
4、中序遍历:
- 先访问左子树
- 再访问根
- 最后访问右子树
void InorderTraverse(BiTree root)
{
if(root != NULL)
{
InorderTraverse(root->LChild);
visit(root);
InorderTraverse(root->RChild);
}
}
5、后序遍历:
- 先访问左子树
- 再访问右子树
- 最后访问根
void PostorderTraverse(BiTree root)
{
if(root != NULL)
{
PostorderTraverse(root->LChild);
PostorderTraverse(root->RChild);
visit(root);
}
}