二叉树的基本概念、存储结构、和创建方法
来源:互联网 发布:网络电影情迷冯家屯 编辑:程序博客网 时间:2024/06/11 09:43
一、二叉树的基本概念
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); }}
- 二叉树的基本概念、存储结构、和创建方法
- 二叉树的存储结构和实现
- 二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树
- 二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- TP5 获取数据集记录数
- 这部电影平均每秒成本18万,科幻片都学它,《阿凡达2》被迫延期
- shader之各种空间与光照
- 2017年前端面试题整理汇总100题
- 大页面和透明大页面
- 二叉树的基本概念、存储结构、和创建方法
- Oracle恢复数据库管理员密码
- 测试
- 犯的迷糊1(C++ friend友元 & 构造函数)
- Mysql安装教程
- 51Nod-1612-合法表达式
- Centos 常用命令
- I
- Vec3----屏幕世界视窗的乱七八糟的转换关系