二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点
被访问一次且仅被访问一次。
在二叉树的遍历中存在四种较为常用的遍历方式:前序遍历、中序遍历、后序遍历、层序遍历
前序遍历
使用递归方式实现前序遍历的具体过程为:
- 访问根节点
- 遍历左子树
- 遍历右子树
中序遍历
使用递归方式实现中序遍历的具体过程为:
- 遍历左子树
- 访问根节点
- 遍历右子树
后序遍历
使用递归方式实现后序遍历的具体过程为:
- 遍历左子树
- 遍历右子树
- 访问根节点
注意:
- 已知 前序遍历序列 和 中序遍历序列,可以唯一确定一颗二叉树
- 已知 中序遍历序列 和 后序遍历序列,可以唯一确定一颗二叉树
而已知 前序和后序 是不能确定一颗二叉树的
层序遍历
使用递归方式实现前序遍历的具体过程为:
- 从根节点从上往下逐层遍历
- 在同一层,按从左到右的顺序对结点逐个访问
二叉树的示例:
二叉树的创建:
- 先使用二叉链的结构写一个建立二叉树的函数(函数返回根节点)
- 代码以前序遍历方式输入二叉树,当输入“#”时,指针指向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;
}
四种遍历方式的代码详解:
习题
- 已知二叉树后序遍历序列是bfegcda,中序遍历序列是badefcg,它的前序遍历序列是:
A. abcdefg
B. abdcefg
C. adbcfeg
D. abecdfg
正确答案 B
答案解析
直接看到a的子节点d,答案就出来了
- 一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足?
A. 所有的结点均无左孩子
B. 所有的结点均无右孩子
C. 只有一个叶子结点
D. 是一棵满二叉树
正确答案:C
答案解析:
因为先序遍历结果是“根左右”,后序遍历结果是“左右根”。
- 当没有左子树时,就是“中右”和“右中”
- 当没有右子树时,就是“中左”和“左中”
则所有的结点均无左孩子或所有的结点均无右孩子均可,所以A、B不能选,又所有的结点均无左孩子与所有的结点均无右孩子时,均只有一个叶子结点,故选C。
- 下列哪一个术语与数据的存储结构无关
A. 顺序表
B. 静态数组
C. 二叉树
D. 链表
正确答案: C
答案解析:
数据结构概念一般包括 3方面的内容:数据之间的逻辑关系即数据的逻辑结构;数据在计算机中的存储方式即数据的存储结构;及在这些数据上定义的运算的集合。
- 线性表是最简单、最常用的一种数据结构。线性表的逻辑结构是n个数据元素的有限序列(a1,a2,……,an)。由于顺序表采用的是顺序存储方式,用存储单元的邻接性体现线性表元素间的一维顺序关系,因此,对线性表进行插入和删除运算时,可能需要移动大量的结点,以保持这种物理和逻辑的一致性。
- 在链表的每个结点中包括指针字段,其中rlink指向结点的后继,llink指向结点的前驱,就可以方便地进行向后和向前两个方向的查找了,这样的链表称作双链表。
- 二叉树 是指数据的逻辑结构,只抽象地反映了数据之间的逻辑关系,而不管其在计算机中的存储方式。
如有不同见解,欢迎留言探讨!