阅读目录
一、树的基本概念
二、二叉树的概念
三、二叉树的存储结构
四、二叉树的遍历
五、软考真题练习
一、树的基本概念
树(Tree)是n(n≧0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:有且仅有一个特定的称为根的结点。当n>1时,其余结点可分为m(m>=0)个互不相交的有限集T1、T2、T3……、Tm,其中每个集合本身又是一棵树,并且称为根的子树。
双亲、孩子和兄弟:结点的子树的根称为该结点的孩子,相应地,该结点称为其子结点的双亲。具有相同双亲的结点互为兄弟。例如图中,结点A是树根, B、 C、 D是A的孩子结点, B、C、D互为兄弟; E、F互为兄弟, B是E和F的双亲。
结点的度:一个结点的子树的个数记为该结点的度。例如图中, B的度为2, C的度为0, D的度为1.
叶子结点:也称为终端结点,指度为零的结点。例如图中, E、F、C、G都是叶子结点。
内部结点:度不为零的结点称为分支结点或非终端结点。除根结点之外,分支结点也称为内部结点。例如图中,B、D都是内部结点。
结点的层次:根为第一层,根的孩子为第二层,依此类推,若某结点在第1层,则其孩子结点就在第i+1层。例如图中, A在第1层, B、C、D在第2层,和G在第3层。
树的高度:一棵树的最大层数记为树的高度(或深度),例如,图所示的树高度为3 。
有序(无序)树:若将树中结点的各子树看成是从左到右有次序关系,即不能交换次序,则称该树为有序树,否则称为无序树。
森林:是m(m>=0)棵互不相交的树的集合。
二、二叉树的概念
1、二叉树的基本概念
二叉树是n(n>=0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两颗不相交的、分别称为左子树和右子树所组成。
2、二叉树的5种基本形态:
(1)、空二叉树
(2)、只有一个根节点
(3)、根节点只有左子树
(4)、根节点只有右子树
(5)、.根节点既有左子树,又有右子树
3、二叉树的特点
- 每个结点最多只有两颗子树,暨不存在结点度大于2的结点。
- 子树有左右之分,不能颠倒。
4、二叉树的性质
性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)
性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
性质3:包含n个结点的二叉树的高度至少为(log2n)+1
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
5、完全二叉树以及满二叉树的概念
- 满二叉树:深度为k的二叉树y有2k-1个结点
- 完全二叉树:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下层的叶结点集中在靠左的若干位置上。
- 完全二叉树的特点
(1)叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。
(2)完全二叉树结点树n满足2k-1-1<n<=2k-1。
(3)满二叉树一定是完全二叉树,反之不成立!
三、二叉树的存储结构
1、顺序存储
-
二叉树的顺序存储结构
用一组地址连续的存储单元,以层序顺序存放二叉树的数据元素,结点的相对位置蕴含着结点之间的关系。完全二叉树的顺序存储 -
一般二叉树的顺序存储
把一般的二叉树先补成完全二叉树,然后按照完全二叉树的顺序存储方式进行存储,而新补上去的结点只占位置,不存放结点数据。
2、链式存储
- 二叉链表
- 三叉链表
四、二叉树的遍历
1、先序遍历
(1)访问根结点
(2)先序遍历左子树
(3)先序遍历右子树
c语言代码
void inOrder(BiTree root)
{ if(root==NULL) return; /*遇到空树(子树)时返回*/
else
{
printf("%c",data); /*访问根结点*/
inOrder(root->lchild); /*先序遍历根结点的左子树*/
inOrder(root->rchild); /*先序遍历根结点的右子树*/
}
}
2、中序遍历
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
c语言代码
void inOrder(BiTree root)
{ if(root==NULL) return; /*遇到空树(子树)时返回*/
else
{
inOrder(root->lchild); /*中序遍历根结点的左子树*/
printf("%c",data); /*访问根结点*/
inOrder(root->rchild); /*中序遍历根结点的右子树*/
}
}
3、后序遍历
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根结点
c语言代码
void inOrder(BiTree root)
{ if(root==NULL) return; /*遇到空树(子树)时返回*/
else
{
inOrder(root->lchild); /*后序遍历根结点的左子树*/
inOrder(root->rchild); /*后序遍历根结点的右子树*/
printf("%c",data); /*访问根结点*/
}
}
4、、层次遍历
层次遍历:ABCDEFG
c语言代码
void levelOrder(BiTree root)
{
BiTree p;
initQueue(0); /*创建并初始化一个BiTree型空队列*/
EnterQueue(0,root); /*将结点指针root入队*/
while(!Empty (0) /*只要队列不为空加循环*/
{
DelQueue(0,p); /*队头元素出队,并用p指向该出对元素*/
printf("%c",p->data);/*访问p指向的结点*/
if(p->lchild)
EnterQueue(0,p->lchild); /*结点*p的左子树入队*/
if(p->rchild)
EnterQueue(0,p->rchile); /*结点*p的右子树入队*/
}
}
例如,求下面二叉树的各种遍历
前序遍历:A B D E G H C F
中序遍历:D B G E H A C F
后序遍历:D G H E B F C A
层次遍历:A B C D E F G H
4、由先序和中序遍历序列建立二叉树
知道先序遍历和中序遍历可以建立二叉树
知道后序遍历和中序遍历可以建立二叉树
知道先序遍历和后序遍历不可以建立二叉树
五、软考真题练习
1、
先序遍历:ABDCE
中序遍历:BDAEC
2、
先序遍历:ABCD
后序遍历:CDBA
3、
先序遍历:ABDCEFG
中序遍历:BDACFGE
4、先序遍历:ABCD,中序遍历:BADC,求后序遍历?
后序遍历:BDCA