二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。
在二叉树的遍历中存在四种较为常用的遍历方式:前序遍历、中序遍历、后序遍历、层序遍历
前序遍历
使用递归方式实现前序遍历的具体过程为:
- 访问根节点
- 遍历左子树
- 遍历右子树
中序遍历
使用递归方式实现中序遍历的具体过程为:
- 遍历左子树
- 访问根节点
- 遍历右子树
后序遍历
使用递归方式实现后序遍历的具体过程为:
- 遍历左子树
- 遍历右子树
- 访问根节点
注意:
- 已知 前序遍历序列 和 中序遍历序列,可以唯一确定一颗二叉树
- 已知 中序遍历序列 和 后序遍历序列,可以唯一确定一颗二叉树
而已知 前序和后序 是不能确定一颗二叉树的
层序遍历
使用递归方式实现前序遍历的具体过程为:
- 从根节点从上往下逐层遍历
- 在同一层,按从左到右的顺序对结点逐个访问
二叉树的示例:
二叉树的创建:
- 先使用二叉链的结构写一个建立二叉树的函数(函数返回根节点)
- 代码以前序遍历方式输入二叉树,当输入“#”时,指针指向NULL,说明是该处为空
图解二叉树的创建
二叉树的创建代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef char BTDataType;
// 二叉链
typedef struct BinaryTreeNode {
BTDataType data; // 当前节点值域
struct BinTreeNode* lChild; // 指向当前节点左孩子
struct BinTreeNode* rChild;// 指向当前节点右孩子
}BTNode;
//返回根节点(二叉树的创建)
BTNode *BinaryTreeCreate(BTDataType* src){
static int s_n = 0;
if (src[s_n] == '#'){
s_n++;
return NULL;
}
BTNode * cur = (BTNode *)malloc(sizeof(BTNode));
cur->data = src[s_n];
s_n++;
cur->lChild = BinaryTreeCreate(src);
cur->rChild = BinaryTreeCreate(src);
return cur;
}
四种遍历方式的代码详解:
前序遍历
中序遍历
后序遍历
层序遍历
如有不同见解,欢迎留言探讨!