大话数据结构读书笔记——第六章 树

一、树(Tree)是n(n>=0)个结点的有限集。

度:结点拥有的子树称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为分支结点或非终端结点(内部结点)。

树的度是树内各结点的度的最大值

结点的子树的根称为该结点的孩子(Child),相应地,该结点称为孩子的双亲(Parent)。

同一个双亲的孩子之间互称兄弟(Sibling)。

结点的层次从根开始定义起,根为第一层,根的孩子为第二层;双亲在同一层的结点互称为堂兄弟;树中结点的最大层次称为树的深度(Depth)。

如果将树中结点的各子树看成从左至右是有次序的,不能互换,则称该树为有序树,否则称为无序树。

森林(Forest)是m(m>=0)棵互不相交的树的集合。对于树中的每个结点而言,其子树的集合即为森林。

二、树的存储结构

树的存储结构的表示方法:双亲表示法、孩子表示法和孩子兄弟表示法。

1. 双亲表示法:树的每个结点中附设一个指示器指示其双亲结点在数组中的位置。

2. 孩子表示法:把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。

3. 孩子兄弟表示法:任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。这个表达法的最大好处是它把一棵复杂的树变成了一棵二叉树

三、二叉树

二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。注:与树结构不同的是,对于二叉树来说,左子树和右子树是不同的。

斜树:所有的结点都只有左子树的二叉树叫左斜树;所有结点都只有右子树的二叉树叫右斜树。

满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉对称为满二叉树。

完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。

四、二叉树的遍历(tranversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

1. 前序遍历:规则是右二叉树为空,则空操作返回;否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。

2. 中序遍历:规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树;

3. 后序遍历:规则是右树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问右子树,最后访问根结点。

4. 层序遍历:规则是若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,近从左到右的顺序对结点逐个访问。

遍历的意义:把树中结点变成某种意义的线性序列。

注:已经前序遍历序列和后序遍历序列或者已经后序遍历序列和中序遍历序列,可以唯一确定一棵二叉树;已经前序和后序遍历,是不能确定一棵二叉树的。

五、线索二叉树:指向前驱和后继的指针称为线索,增加线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树(Threaded Binary Tree)。

六、二叉树的应用:赫夫曼编码和赫夫曼树

你可能感兴趣的:(C/C++,读书笔记,数据结构)