二叉树的定义、存储结构、树的遍历
2018-03-08 12:11
477 查看
参考:《大话数据结构》 程杰版
二叉树具有五种基本的形态:
1. 空二叉树。
2. 只有一个根结点。
3. 根结点只有左子树。
4. 根结点只有右子树。
特殊的二叉树
1. 斜树。
2. 满二叉树。
3. 完全二叉树。
使用顺序存储结构表现二叉树的时候,在其线性结构中,会存在一些空结点,但是其会占据一定的内存空间,会造成存储空间的浪费;所以,顺序存储结构一般只用于完全二叉树。
二叉链表的结点结构定义代码:
二叉树的遍历方法:
1. 前序遍历
2. 中序遍历
3. 后序遍历
1.首先创建一棵二叉树
构建二叉树,向结点的数据域中添加字符。
2.二叉树的前序遍历算法
3.二叉树的中序遍历算法
4.二叉树的后序遍历算法
前序遍历、中序遍历和后序遍历算法的核心算法大致相同,都是利用了函数递归的原理。这里顺带补充一下关于函数递归调用的原理:
裴波那契数列的实现来讲解函数的递归调用,假设存在这样一个函数:
使用递归实现裴波那契数列代码如下:
通过二叉树的结构来分析递归调用的执行过程:(摘自大话数据结构 P103页)
主函数中的测试代码如下:
输出如下图所示:
假设输入这样一个二叉树数据结构:
“#”代表当前节点的数据域为空
扫码获取更多相关文章:
二叉树的定义:
二叉树是n个结点的有限集合,该集合或者为空集,或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树具有五种基本的形态:
1. 空二叉树。
2. 只有一个根结点。
3. 根结点只有左子树。
4. 根结点只有右子树。
特殊的二叉树
1. 斜树。
2. 满二叉树。
3. 完全二叉树。
二叉树的顺序存储结构:
二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系,左右兄弟的关系。使用顺序存储结构表现二叉树的时候,在其线性结构中,会存在一些空结点,但是其会占据一定的内存空间,会造成存储空间的浪费;所以,顺序存储结构一般只用于完全二叉树。
二叉树的链式存储结构:
由于二叉树的每个结点最多有两个孩子,所以为每个结点设计一个数据域和两个指针域,通常将其称之为二叉链表。二叉链表的结点结构定义代码:
typedef char TElemType; typedef struct BinaryTreeNode{ TElemType data; //lchild指向左结点的指针 //rchild指向右结点的指针 struct BinaryTreeNode *lchild,*rchild; }BinaryTreeNode,*BinaryTree;
二叉树的遍历
二叉树的遍历是指从根结点出发,按照某种次序一次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。二叉树的遍历方法:
1. 前序遍历
2. 中序遍历
3. 后序遍历
1.首先创建一棵二叉树
构建二叉树,向结点的数据域中添加字符。
void CreateBinaryTree(BinaryTree *T){ TElemType ch; cin>>ch; if (ch=='$'){ *T=NULL; }else{ *T=new BinaryTreeNode; if (!*T)return; (*T)->data=ch; CreateBinaryTree(&(*T)->lchild); CreateBinaryTree(&(*T)->rchild); } }
2.二叉树的前序遍历算法
void PreOrderTraverse(BinaryTree T){ if (T==NULL){ cout<<"#"<<" "; return; } cout<<T->data<<" "; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); }
3.二叉树的中序遍历算法
void InOderTraverse(BinaryTree T){ if(T!=NULL){ cout<<"#"<<" "; return; } InOderTraverse(T->lchild); cout<<T->data<<" "; InOrderTraverse(T->rchild); }
4.二叉树的后序遍历算法
void PostOrderTraverse(BinaryTree T){ if (T->NULL){ cout<<"#"<<" "; return; } PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout<<T->data<<" "; }
前序遍历、中序遍历和后序遍历算法的核心算法大致相同,都是利用了函数递归的原理。这里顺带补充一下关于函数递归调用的原理:
裴波那契数列的实现来讲解函数的递归调用,假设存在这样一个函数:
F(n)= \begin {cases} 0,\quad n\ =0 \\ 1,\quad n\ =1 \\ F(n-1)+F(n-2),\quad n>1 \ end {cases}
使用递归实现裴波那契数列代码如下:
int Fibonacci(int i){ if (i<2){ return i==0?0:1; } return Fibonacci(i-1)+Fibonacci(i-2); }
通过二叉树的结构来分析递归调用的执行过程:(摘自大话数据结构 P103页)
主函数中的测试代码如下:
//测试代码 int main() { BinaryTree tree = new BinaryTreeNode; cout << "构建一颗由字符构成的二叉树,#代表空" << endl; CreateBinaryTree(&tree); cout << "二叉树的前序遍历输出" << endl; PreOderTraverse(tree); cout << endl; cout << "二叉树的中序遍历输出" << endl; InOderTraverse(tree); cout << endl; cout << "二叉树的后序遍历输出" << endl; PostOderTraverse(tree); cout << endl; return 0; }
输出如下图所示:
假设输入这样一个二叉树数据结构:
“#”代表当前节点的数据域为空
ABD#J##EK###CFL###G##
扫码获取更多相关文章:
相关文章推荐
- 图的邻接表存储结构的定义及其遍历
- 基于三叉链表存储结构的二叉树的不用栈的非递归遍历
- 【数据结构作业四】以二叉链表作存储结构,建立一棵二叉树,并输出该二叉树的先序、中序、后序遍历序列、高度和其叶子结点数。
- 二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树
- 数据结构与算法6:二叉树的存储结构与遍历
- 建一棵二叉树,能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数
- 二叉树的概念,二叉树的数据存储结构,二叉树的性质,二叉树的遍历方法数据结构-树的学习(3)
- 数据结构--二叉树(定义与存储结构)
- 二叉树的链式存储结构 前序 后序 中序 层序遍历操作实现 判断是否完全二叉树
- 数据结构与算法简记:按层次顺序遍历和存储二叉树
- 数据结构(12)--二叉树的静态链表存储和遍历的实现
- 数据结构把顺序存储的二叉树转换成链式存储及前序,中序,后序遍历
- 二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树
- 数据结构-二叉树的存储结构和遍历算法(四)
- 数据结构:二叉树的遍历和存储结构
- 数据结构-二叉树的存储结构与遍历
- 二叉树 - 遍历和存储结构
- 二叉树的存储结构和遍历
- 数据结构(13)二叉树的动态链表存储和遍历的实现
- 二叉树的存储结构及其遍历