二叉树的结构简单,存储效率高,运算的算法也相对简单,并且任何树和森林与二叉树之间都可以通过简单的操作规则相互转换。在树的应用当中,它起着举足轻重的作用。对于在某个阶段都是两种结果的情形,比如开和关,0和1,真和假,上和下,正面和反面都适用二叉树来进行建模。
由此可知,二叉树的定义是一个递归定义,其特点可以归纳如下:
每个节点最多有两颗子树,所以二叉树中不存在度大于2的节点。注意不是只有两棵子树,而是最多只有两棵子树,没有子树或者有一棵子树都是可以的
左子树和右子树都是有顺序的,次序不能够随意进行颠倒,就像人的双手,双脚,但显然左手,左脚和右手,右脚是不一样的
即使树中某节点只有一颗子树,也要区分它是左子树还是右子树
关于二叉树的基本操作
Tree_Initate(t):将t初始化为空的二叉树
Tree_Creat(t):创建一个非空的二叉树
Tree_Destory(t):销毁二叉树
Tree_Empty(t):判断二叉树是否为空,空则返回TRUE,否则返回FALSE
Tree_Root(t) :求二叉树t的根节点。若t为空的二叉树,则函数返回“空”
Tree_Parent(t):求双亲函数,求二叉树t中的节点x的双亲节点。若节点x是二叉树的根节点或者二叉树中无节点x,则返回“空”
Tree_Leftchild(t):求左孩子,若节点x为叶子节点或x不在t当中,则返回“空”
Tree_Rightchild(t):求右孩子,若节点x为叶子节点或者x不在t当中,则返回“空”
Tree_Traverse(t):遍历操作,按某个次序依次访问二叉树中每个节点依次且仅有依次
Tree_Clear(t):清除操作,将二叉树t置位空树
二叉树的性质:
特殊形态的二叉树:
1.满二叉树:若一棵二叉树的高度为k,且共有2的k次方减一(k大于等于1)个节点,则此二叉树称为满二叉树。这种树的特点是每层上的节点时都是最大的节点数,满二叉树的终端节点都在同一层。除了叶子节点以外,其余的节点都有左右两个孩子。满二叉树中不存在度为一的节点。
2.完全二叉树:若在一棵高度为k(k>1)的二叉树中,第一层到第K-1层构成一颗深度为k-1的满二叉树,第k层的节点不满2的k-1个节点,而且这些节点都满放在该层的最左边,则此二叉树称为完全二叉树。完全二叉树中的叶子节点只可能出现在二叉树中层次最大的两层上,最大的一层的节点一定是从最左边开始向右放满的。 在一棵完全二叉树中,某个节点没有左孩子,就没有右孩子。
2.关于二叉树的数学性质:
性质一:二叉树第i层上的节点数目最多为2的 i - 1 次方个
性质二:深度为k的二叉树最多有2的k - 1次方个节点(≥1)【性质二就是性质一公式的求和】
性质三:对于任何一个二叉树T,如果其叶子节点数为n,度为2的节点数为x,则n = x + 1;
性质四:具有n个节点的完全二叉树的深度为:log以2为底n 的对数 加一;
性质五:对一棵有n个节点的完全二叉树(其深度为log以二为底n的对数 加 1),按照从根节点起,自上而下,从左到右的约定对所有的节点从 1 到 n 开始进行编号,并按此编号将该二叉树中各节点顺序的存放在一个一维数组当中,则对于任意编号为 i 的节点(1 ≤ i ≤ n)有以下的性质。
(1)如果对 i = 1,则节点 i 为根节点,无双亲;如果 i > 1,则 i 的双亲节点为 i / 2;
(2)如果2i ≤ n;则节点 i 的右孩子为 2i + 1;否则无右孩子;
(3)如果节点 i 的序号为奇数,并且不等于 1 ,则它的左兄弟为 i -1;
(4)如果节点 i 的序号为偶数,并且不等于 1,则它的右兄弟为 i + 1;
(5)如果 2i ≤ n,则节点 i 的左孩子为 2i, 否则无左孩子。即满足 2i > n 的节点为叶子节点;
(6)节点 i 所在的层数为log以二为底 i 的对数 加一;
注意:关于二叉树的数学性质,要注意他们的使用范围,性质一,二,三适用于所有的二叉树,性质四,五只适用于完全二叉树(满二叉树是完全二叉树的特殊形式)