二叉树的基本概念、存储结构、和创建方法
2017-09-22 18:55
393 查看
一、二叉树的基本概念
1、二叉树的定义
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。
2、二叉树的特点
(1)每个二叉树最多有两棵子树,所以二叉树中不存在度大于2的结点。
(2)左子树和右子树是有顺序的,次序不能任意颠倒。
(3)即使树中某结点只有一颗子树,也要区分它是左子树还是右子树。
3、特殊二叉树
(1)斜树:所有的结点都只有左子树的二叉树叫左斜树。所有的结点都只有右子树的二叉树叫右斜树。这两者统称为斜树。
(2)满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
(3)完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。
4、二叉树的性质
(1)在二叉树的第i层上至多有2i-1个结点(i>=1)。
(2)深度为k的二叉树至多有2k-1个结点(i>=1)。
(3)为任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
(4)具有n个结点的完全二叉树的深度为└log2n┘+1(└x┘)表示不大于x的最大整数。
(5)如果一棵有n个结点的完全二叉树(其深度为└log2n┘+1)的结点按层序编号(从第1层到第└log2n┘+1层,每层从左到右),对任一结点i(1<=i<=n)有:
①如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点└i/2┘。
②如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子结点是结点2i。
③如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。
二、二叉树的链式存储结构
1、二叉树的结点结构定义:
三、二叉树的创建方法
1、通过前序序列创建二叉树
2、通过先序和中序序列创建二叉树
递归方法:
递归方法:
1、二叉树的定义
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。
2、二叉树的特点
(1)每个二叉树最多有两棵子树,所以二叉树中不存在度大于2的结点。
(2)左子树和右子树是有顺序的,次序不能任意颠倒。
(3)即使树中某结点只有一颗子树,也要区分它是左子树还是右子树。
3、特殊二叉树
(1)斜树:所有的结点都只有左子树的二叉树叫左斜树。所有的结点都只有右子树的二叉树叫右斜树。这两者统称为斜树。
(2)满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
(3)完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。
4、二叉树的性质
(1)在二叉树的第i层上至多有2i-1个结点(i>=1)。
(2)深度为k的二叉树至多有2k-1个结点(i>=1)。
(3)为任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
(4)具有n个结点的完全二叉树的深度为└log2n┘+1(└x┘)表示不大于x的最大整数。
(5)如果一棵有n个结点的完全二叉树(其深度为└log2n┘+1)的结点按层序编号(从第1层到第└log2n┘+1层,每层从左到右),对任一结点i(1<=i<=n)有:
①如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点└i/2┘。
②如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子结点是结点2i。
③如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。
二、二叉树的链式存储结构
1、二叉树的结点结构定义:
typedef struct BtNode { ElemType data; struct BtNode *leftChild; struct BtNode *rightChild; }BtNode,*BinaryTree;
三、二叉树的创建方法
1、通过前序序列创建二叉树
BtNode * CreateTree1()//通过前序遍历序列+#号构建二叉树 { BtNode *s = NULL; ElemType item = 0; scanf("%c",&item); if (item != END) { s = BuyNode(); s->data = item; s->leftChild = CreateTree1(); s->rightChild = CreateTree1(); } return s; } BtNode * CreateTree2(ElemType *&str)//指针的引用 { BtNode *s = NULL; if (str != NULL && *str != END) { s = BuyNode(); s->data = *str; s->leftChild = CreateTree2(++str); s->rightChild = CreateTree2(++str); } return s; } BtNode * CreateTree3(ElemType * * const pstr) { BtNode *s = NULL; if (pstr != NULL && *pstr != NULL && **pstr != END) { s = BuyNode(); s->data = **pstr; s->leftChild = CreateTree3(&++*pstr); s->rightChild = CreateTree3(&++*pstr); } return s; }
2、通过先序和中序序列创建二叉树
递归方法:
int IsIndex(ElemType *is,ElemType x,int n) { for (int i = 0;i<n;++i) { if (is[i] == x) { return i; } } return -1; } BtNode * CreatePI(ElemType *ps,ElemType *is,int n) { BtNode *s = NULL; if (n > 0) { s = BuyNode(); s->data = ps[0]; int pos = IsIndex(is,ps[0],n);////////////// if (pos == -1) { exit(1); } s->leftChild = CreatePI(ps+1,is,pos); s->rightChild = CreatePI(ps+pos+1,is+pos+1,n-pos-1); } return s; } BtNode * CreateTreePI(ElemType *ps,ElemType *is,int n) { if (ps == NULL || is == NULL || n < 1) { return NULL; } else { return CreatePI(ps,is,n); } }3、通过后序和中序序列创建二叉树
递归方法:
int IsIndex(ElemType *is,ElemType x,int n) { for (int i = 0;i<n;++i) { if (is[i] == x) { return i; } } return -1; } BtNode * CreateIL(ElemType *is,ElemType *ls,int n) { BtNode *s = NULL; if (n > 0) { int pos = IsIndex(is,ls[n-1],n); if (pos == -1) { exit(1); } s = BuyNode(); s->data = ls[n-1]; s->leftChild = CreateIL(is,ls,pos); s->rightChild = CreateIL(is+pos+1,ls+pos,n-pos-1); } return s; } BtNode * CreateTreeIL(ElemType *is,ElemType *ls,int n) { if (is == NULL || ls == NULL || n < 1) { return NULL; } else { return CreateIL(is,ls,n); } }
相关文章推荐
- 二叉树的概念,二叉树的数据存储结构,二叉树的性质,二叉树的遍历方法数据结构-树的学习(3)
- 数据结构(七)图--图的基本概念及存储结构
- 数据结构与算法系列-串-串的基本概念与存储结构
- 树(基本概念及存储结构)
- 数据的存储结构主要有哪两种基本方法
- C#学习基本概念之类与结构--向方法传递结构与类引用之间的区别
- 线性表的简介(基本概念和存储结构)
- 数据结构之自建算法库——二叉树的链式存储及基本运算
- 基本存储结构_树和二叉树
- 二叉树基本概念——二叉树(概念、性质、顺序存储,链式存储)、满二叉树与完全二叉树、二叉链表,三叉链表,双亲链表
- 以邻接矩阵作为存储结构实现图的创建与基本操作
- 数据结构之自建算法库——二叉树的链式存储及基本运算
- 树的概念总结;树的存储结构;树、二叉树、森林的相互转换
- 树(基本概念及存储结构)
- 二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树
- 继承与合成基本概念 继承:可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。 合成:在新类里创建原有的对象称为合成。
- Oracle中的存储结构的一些基本概念(备忘)
- 数据结构之树和二叉树的一些基本概念
- 数据结构(十二) 二叉树的基本操作 --- 创建一个二叉树 前中后序遍历二叉树
- 创建一个栈存储结构,并且写入一些对栈的基本的操作