7.8 二叉树
2016-06-14 06:36
162 查看
树形结构是一类重要的非线性数据,树和二叉树是常用的树形结构。
◆ 1、树的概念
树(Tree)是由n(n≥0)个结点组成的有限集合。如n=0,称为空树。
非空树有一个特定的结点,它只有直接后继,没有直接前驱,称之为根(root)。除根以外的其它结点划分为m(m≥0)个互不相交的有限集合T0,T1,……,Tm-1,每个集合又是一棵树,称为根的子树(subtree)。每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。这是一个递归方法定义的数据结构,如下图所示。
结点,包括数据项和多个指针项,指针项数目并不固定,且无次序。
结点的度,结点所拥有的子树数量。
叶结点,度为0的结点,如G,I,J,K,L,M,N,O结点。
分支结点,度≥1的结点。
孩子结点,若结点x有子树,则子树根结点即为x的孩子结点。
双亲结点,若结点x有孩子,它即为孩子的双亲。
兄弟结点,同一双亲的结点互称为兄弟。
结点的层次,从根到该结点所经路径上的分支条数。
树的深度,树中结点的层次数。
树的度,树中结点度的最大值。
◆ 2、二叉树的概念
二叉树(Binary
Tree)是另一种独立的树形结构。二叉树是结点的一个有限集合,该集合或为空,或是由一个根结点及两棵树分别称为左子树和右子树的(注意有左右之分)互不相交的二叉树组成,其中左右子树分别可以为空子树或均为空树。这也是一个递归的定义。二叉树的特点是:每个结点最多两个孩子,并且子树有左右之分。
二叉树的基本性质:
二叉树的第i层上最多有2i-1(i>=1)个结点;
深度为h的二叉树中最多有2h-1个结点;
在任一棵二叉树中,有n0叶子结点,有n2个度为2的结点,则有n0=n2+1。
◆ 3、链式二叉树的结点类模板
先在此定义结点类模板,下一节在其基础上定义二叉树类模板。(查看源码)
◆ 1、所谓二叉树的遍历(binary
tree traversal),就是遵从某种次序,查巡二叉树的所有结点,每个结点都被访问一次,而且仅访问一次。所谓“访问”指对结点施行某些操作,但不破坏它原来的数据结构。
遍历二叉树有不同次序,规定先左后右,令L,R,V分别代表遍历一个结点的左右子树和访问该结点的操作,有三种方式: 前序遍历(VLR)、 中序遍历(LVR)、 后序遍历(LRV)
◆ 2、链式二叉树类模板
template<typename T>class BinaryTree{
Node<T> *root; //二叉树的根指针
void InOrder(Node<T> *Current); //中序遍历
void PreOrder(Node<T> *Current); //前序遍历
void PostOrder(Node<T> *Current); //后序遍历
void Insert(const T &data,Node<T> * &b);
//插入结点,参数为引用!
void Destory(Node<T> * Current); //删除树
public:
BinaryTree(){root=NULL;} //空树构造函数
~BinaryTree(){Destory(root);} //析构函数
void Creat(T* data,int n); //建立(排序)二叉树
void InOrder(){InOrder(root);}
//中序遍历,公有函数为接口
void PreOrder(){PreOrder(root);}
//前序遍历,公有函数为接口
void PostOrder(){PostOrder(root);}
//后序遍历,公有函数为接口
};
详细代码参见【例7.13】
二叉排序树(Binary
Sorting Tree)又称二叉搜索树(Binary
Search Tree),是一种特殊结构的二叉数,作为一种排序和查找的手段,对应有序表的对半查找,通常亦被称为数表。其定义也是递归的。
二叉排序树的定义:二叉排序树或者是空树或者是具有下述性质的二叉数,其左子树上所有结点的数据值均小于根结点的数据值;右子树上所有结点的数据值均大于等于根结点的数据值,左子树和右子树又各是一棵二叉排序树。
二叉排序树用中序遍历就可以得到由小到大的有序序列,如下图可得有序序列{8,10,11,12,15,16,18,22,24,26,29}。
图 二叉排序树例
二叉排序树的结点插入(可生成排序二叉树)生成算法:对任意一组数据元素序列{a0,a1,a2,…,an-1}。要生成二叉排序树的过程为:
令a0为二叉树的根结点。
若a1<a0,令a1为a0左子树的根结点,否则a1为a0右子树的根结点。
如ai小于根结点,则去左子树,否则去右子树,按此法查找,直到成为空树,则安放此位置。这步就是插入算法。
【例7.15】二叉排序树查找函数。(查看源码)
算法:用中序遍历即可,但递归慢。
二叉树的概念
◆ 1、树的概念树(Tree)是由n(n≥0)个结点组成的有限集合。如n=0,称为空树。
非空树有一个特定的结点,它只有直接后继,没有直接前驱,称之为根(root)。除根以外的其它结点划分为m(m≥0)个互不相交的有限集合T0,T1,……,Tm-1,每个集合又是一棵树,称为根的子树(subtree)。每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。这是一个递归方法定义的数据结构,如下图所示。
结点,包括数据项和多个指针项,指针项数目并不固定,且无次序。
结点的度,结点所拥有的子树数量。
叶结点,度为0的结点,如G,I,J,K,L,M,N,O结点。
分支结点,度≥1的结点。
孩子结点,若结点x有子树,则子树根结点即为x的孩子结点。
双亲结点,若结点x有孩子,它即为孩子的双亲。
兄弟结点,同一双亲的结点互称为兄弟。
结点的层次,从根到该结点所经路径上的分支条数。
树的深度,树中结点的层次数。
树的度,树中结点度的最大值。
◆ 2、二叉树的概念
二叉树(Binary
Tree)是另一种独立的树形结构。二叉树是结点的一个有限集合,该集合或为空,或是由一个根结点及两棵树分别称为左子树和右子树的(注意有左右之分)互不相交的二叉树组成,其中左右子树分别可以为空子树或均为空树。这也是一个递归的定义。二叉树的特点是:每个结点最多两个孩子,并且子树有左右之分。
二叉树的基本性质:
二叉树的第i层上最多有2i-1(i>=1)个结点;
深度为h的二叉树中最多有2h-1个结点;
在任一棵二叉树中,有n0叶子结点,有n2个度为2的结点,则有n0=n2+1。
◆ 3、链式二叉树的结点类模板
先在此定义结点类模板,下一节在其基础上定义二叉树类模板。(查看源码)
二叉树的遍历
◆ 1、所谓二叉树的遍历(binarytree traversal),就是遵从某种次序,查巡二叉树的所有结点,每个结点都被访问一次,而且仅访问一次。所谓“访问”指对结点施行某些操作,但不破坏它原来的数据结构。
遍历二叉树有不同次序,规定先左后右,令L,R,V分别代表遍历一个结点的左右子树和访问该结点的操作,有三种方式: 前序遍历(VLR)、 中序遍历(LVR)、 后序遍历(LRV)
◆ 2、链式二叉树类模板
template<typename T>class BinaryTree{
Node<T> *root; //二叉树的根指针
void InOrder(Node<T> *Current); //中序遍历
void PreOrder(Node<T> *Current); //前序遍历
void PostOrder(Node<T> *Current); //后序遍历
void Insert(const T &data,Node<T> * &b);
//插入结点,参数为引用!
void Destory(Node<T> * Current); //删除树
public:
BinaryTree(){root=NULL;} //空树构造函数
~BinaryTree(){Destory(root);} //析构函数
void Creat(T* data,int n); //建立(排序)二叉树
void InOrder(){InOrder(root);}
//中序遍历,公有函数为接口
void PreOrder(){PreOrder(root);}
//前序遍历,公有函数为接口
void PostOrder(){PostOrder(root);}
//后序遍历,公有函数为接口
};
详细代码参见【例7.13】
二叉排序树
二叉排序树(BinarySorting Tree)又称二叉搜索树(Binary
Search Tree),是一种特殊结构的二叉数,作为一种排序和查找的手段,对应有序表的对半查找,通常亦被称为数表。其定义也是递归的。
二叉排序树的定义:二叉排序树或者是空树或者是具有下述性质的二叉数,其左子树上所有结点的数据值均小于根结点的数据值;右子树上所有结点的数据值均大于等于根结点的数据值,左子树和右子树又各是一棵二叉排序树。
二叉排序树用中序遍历就可以得到由小到大的有序序列,如下图可得有序序列{8,10,11,12,15,16,18,22,24,26,29}。
图 二叉排序树例
二叉排序树的结点插入(可生成排序二叉树)生成算法:对任意一组数据元素序列{a0,a1,a2,…,an-1}。要生成二叉排序树的过程为:
令a0为二叉树的根结点。
若a1<a0,令a1为a0左子树的根结点,否则a1为a0右子树的根结点。
如ai小于根结点,则去左子树,否则去右子树,按此法查找,直到成为空树,则安放此位置。这步就是插入算法。
【例7.15】二叉排序树查找函数。(查看源码)
算法:用中序遍历即可,但递归慢。
相关文章推荐
- typedef如何显示变量类型名
- 7.7 栈与队列-队列及其操作
- 7.6 栈与队列-栈的基本操作和应用
- Pascal's Triangle II
- 7.5 链表-双向链表
- 勾股定理一日一证连载22
- 7.4 链表-单链表类型模板
- 奶爸日记
- 7.3 链表-单链表的基本算法
- 7.2 浅复制与深复制
- 7.1 自由存储区内存分配
- absort函数和exit函数
- App启动加载广告页面思路
- 了解流程类型,第 3 篇:动态消息广告
- 114. Flatten Binary Tree to Linked List
- Binary Tree Level Order Tranversal
- Increasing Triplet Subsequence
- Remove Duplicates from Sorted Array
- Pascal's Triangle
- Letter Combinations of a Phone Number