树(Tree)是n(n>=0)个节点的有限集。n=0时称为空树。在任意一个非空树中:(1)有且仅有一个特定的称为根(Root)的节点;(2)当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2.......Tm,其中每一个集合本身又是一棵树,并且称为根的子树(Sub Tree).
结点分类:
结点拥有的子节点树称为结点的度(Degree).
度为0的结点,称为叶结点或终端节点
度不为0的结点称为非终端节点或分支结点。
除根结点之外,分支结点也成为内部结点。
数的度是数内各结点的度的最大值。
结点间的关系
结点的子树的根称为该结点的孩子(Child),相应的,该结点称为孩子的双亲
线性结构与树结构的比较
二叉树
二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成
下图就是二叉树:
二叉树具有五种基本形态:
1,空二叉树
2,只有一个结点
3,根结点只有左子树
4,根结点只有右子树
5,根结点既有左子树又有右子树
特殊的二叉树:
1,斜树:所有的结点都只有左子树的二叉树叫左斜树(上图树2)。所有的结点都只有右子树的二叉树叫右斜树。
2,满二叉树:一个二叉树中,所有的分支结点都有左子树和右子树,并且所有的叶子都在同一层,这样的二叉树称为满二叉树;
3,完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果标号为i(1<=i<=n) 的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这棵树称为完全二叉树
下图就是一个完全二叉树:
注意:
二叉树的性质
-------03.20.193------
二叉树性质1:在二叉树的第i层之多有
个结点(i>1)
二叉树性质2:深度为K的二叉树至多有
个结点(k>1)
二叉树性质3:对任意一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
二叉树性质4:具有n个结点的完全二叉树的深度为[log2 n] + 1
二叉树性质5:
二叉树存储结构:
可以顺序存储二叉树,但是顺序存储结构一般只用于完全二叉树。
下面这种以顺序存储二叉树的方式就特别浪费内存空间
二叉链表
二叉树每一个结点最多有两个孩子,所以为他设计一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表
指针
遍历二叉树
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每一个结点被访问一次且仅被访问一次;
二叉树的遍历方法:
1,前序遍历
规则:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。
下图的遍历结果为:ABDGHCEID
2,中序遍历
规则:若树为空,则空操作返回,否则从根结点开始(注意并不是想访问根结点),中序遍历根结点的左子树,然后访问根结点,最后中序遍历右子树
下图的遍历结果是:GDHBAEICF
3,后序遍历
规则:若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点
下图的遍历结果是:GHDBIEFCA
4,层序遍历
规则:若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按照从左到右的顺序对结点逐个访问
下图的遍历结果是:ABCDEFGHI
线索二叉树:我们把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。
树与森林的遍历:
树的遍历分为两种方式:
1,一种是先根遍历树,即先访问根结点,然后依次先根遍历根的每棵树。
2,另一种是后根遍历,即先依次后根遍历每棵树,然后再访问根结点。
森林的遍历也分为两种方式:
1,前序遍历:先访问森林中的第一棵树的根结点,然后再依次先根遍历根的每棵子树,再依次用同样的方式遍历除去每一棵树的剩余树构成的森林。
2,后序遍历:先访问森林中的每一个棵树,后根遍历的方式遍历每棵子树,然后再访问根结点,再依次同样的方式遍历除去每一棵树的剩余树构成的森林。
赫夫曼(David Huffman,美国数学家