数据结构之树结构——二叉树
2016-12-18 23:38
141 查看
树结构是一种常用的非线性数据结构。
树的形式化定义:树是由n(n>=0)个结点组成的有穷集合,在任意的一个非空树中,有且仅有一个称为根(Root)的结点,当n>1时,其余的结点分为m(m>0)个互不相交的有限集,T1,T2,……Tm,其中,每一个集合本身又是一棵树,并称为根的子树(SubTree)。
树结构在计算机中的存储形式很多,最简单的一种就是多重链表,可描述如下:
#define MaxChild 10
typedef struct node
{
dataType data;
struct node *child[MaxChild];
}
这种表示方法最大的有点是节省内存资源,缺点是操作起来相对复杂。
二叉树(Binary Tree)是一种特殊的树结构,其定义如下:它或者为空,或者由一个根节点加上两颗分别称为左子树和右子树的互不相交的二叉树组成。
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
二叉树的遍历
1、先序遍历(访问根结点,先序遍历左子树,先序遍历右子树)
PreOrderTraverse(BiTree T)
{
if (T)
/* 递归结束条件,T为空 */
{
visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
2、中序遍历(中序遍历左子树,访问根结点,中序遍历右子树)
InOrderTraverse(BiTree T)
{
if (T)
/* 递归结束条件,T为空 */
{
InOrderTraverse(T->lchild);
visit(T->data);
InOrderTraverse(T->rchild);
}
}
3、后序遍历(后序遍历左子树,后序遍历右子树,访问根结点)
PosOrderTraverse(BiTree T)
{
if (T)
/* 递归结束条件,T为空 */
{
PosOrderTraverse(T->lchild);
PosOrderTraverse(T->rchild);
visit(T->data);
}
}
二叉树的创建
/* 先序创建一颗二叉树 */
CreateBiTree(BiTree *T)
{
char c;
scanf("%c", &c);
if (c == ' ') *T = NULL;
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
(*T)->data = c;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
树的形式化定义:树是由n(n>=0)个结点组成的有穷集合,在任意的一个非空树中,有且仅有一个称为根(Root)的结点,当n>1时,其余的结点分为m(m>0)个互不相交的有限集,T1,T2,……Tm,其中,每一个集合本身又是一棵树,并称为根的子树(SubTree)。
树结构在计算机中的存储形式很多,最简单的一种就是多重链表,可描述如下:
#define MaxChild 10
typedef struct node
{
dataType data;
struct node *child[MaxChild];
}
这种表示方法最大的有点是节省内存资源,缺点是操作起来相对复杂。
二叉树(Binary Tree)是一种特殊的树结构,其定义如下:它或者为空,或者由一个根节点加上两颗分别称为左子树和右子树的互不相交的二叉树组成。
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
二叉树的遍历
1、先序遍历(访问根结点,先序遍历左子树,先序遍历右子树)
PreOrderTraverse(BiTree T)
{
if (T)
/* 递归结束条件,T为空 */
{
visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
2、中序遍历(中序遍历左子树,访问根结点,中序遍历右子树)
InOrderTraverse(BiTree T)
{
if (T)
/* 递归结束条件,T为空 */
{
InOrderTraverse(T->lchild);
visit(T->data);
InOrderTraverse(T->rchild);
}
}
3、后序遍历(后序遍历左子树,后序遍历右子树,访问根结点)
PosOrderTraverse(BiTree T)
{
if (T)
/* 递归结束条件,T为空 */
{
PosOrderTraverse(T->lchild);
PosOrderTraverse(T->rchild);
visit(T->data);
}
}
二叉树的创建
/* 先序创建一颗二叉树 */
CreateBiTree(BiTree *T)
{
char c;
scanf("%c", &c);
if (c == ' ') *T = NULL;
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
(*T)->data = c;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
相关文章推荐
- 数据结构与算法(C#实现)系列---二叉树
- 数据结构与算法(C#实现)系列---二叉树
- c#-二叉树数据结构及算法
- 数据结构中二叉树的三种遍历方式
- 数据结构——二叉树的遍历
- 数据结构(严蔚敏)二叉树的顺序存储
- 数据结构复习(层次遍历法复制二叉树)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树(数据结构1)
- SDUT-2136数据结构实验之二叉树的建立与遍历
- 数据结构(二叉树)C#描述
- {数据结构}二进制与十进制转换与二叉树关系
- 数据结构之二叉树
- 数据结构线索化二叉树
- 数据结构——后序线索化二叉树
- 数据结构(六)树----树、森林与二叉树的转换及树的存储结构
- C#实现二叉树数据结构以及先序、中序、后续遍历
- 数据结构——链式二叉树
- C++数据结构之二叉树递归操作
- SDUT-2136 数据结构实验之二叉树的建立与遍历