您的位置:首页 > 其它

树和二叉树

2016-03-23 12:48 316 查看
一、树的概念

1、树的特征为有一个特定的根节点,它只有后继没有前驱

2、结点的度:结点拥有的子树的数目

3、树的度:树中结点度的最大值

4、祖先结点:从根到该结点所经过的所有结点

5、

二、二叉树

1、二叉树有左右之分,次序不能颠倒,是有序树。

2、任何一颗二叉树,若有A个0度节点,B个2度节点,则A=B+1

 

三、二叉树的存储

1、顺序存储

       对每个节点进行编号,放入数组中。若不需要进行删除、插入操作,这种方式比较经济

2、链式存储

   最常用的存储方式。根据指针的设置情况不同,有一指针(指向父节点)、二指针(指向儿子)、三指针(都指向)。一般采用二指针就够了

 

四、二叉树的遍历

1、二叉树遍历一般有前序、中序、后序遍历,可以采用递归的方法进行遍历。但是递归的效率比非递归的低,所以采用非递归的算法。

非递归算法就是将访问过的节点保存在栈中,这个作用就替代了递归的效果。后序遍历的非递归算法,每个节点有两次要出现在栈顶。需要进行判断。当第一次出现时不处理,第二次才处理。

    2、层次遍历

       每层从左到右访问。可以用一个队列记忆访问过的节点。访问一个就加入队列。每次访问的下一个节点都是队列头上指针指的点。

 

五、线索化二叉树

     1、线索化二叉树的做法是在原来的二叉链表中增加一个前驱指针域和一个后继指针域,分别指向该结点某中次序下的前驱结点和后继结点

     2、其实就是让每个节点都有两个指针。有左右子树的节点左右两边指的是左右子树,左后两边不满的就添加线索指针。如某个节点A有左子树,但是没有右子树,则右指针就做线索指针,指向某个前驱或后继。

     3、遍历线索化二叉树

 

六、树和森林

1、树的存储

       树的存储有很多种表示方法

      A.广义表。原子节点、表头、子表结构分别对应叶子节点、根节点、除根节点以外的其他分支结构

      B.父亲表示法:节点存储data和parents指针。这种查找父亲效率不错,但是找孩子的话效率就比较低了

      C孩子表示法:采用单链的形式。有点与父亲表示法相反

      D 孩子兄弟表示法:每个节点左边是儿子,右边是兄弟

   2、树和森林的遍历

     A 树的遍历,由于根位于两个树中间,所以只有前序、后序、层次遍历

     B 森林遍历:前序、后序

   3、树和森林与二叉树的转换

      A 森林转二叉树

       首先将第一课树的根作为二叉树的根,然后将第一课树的根去掉,第一棵树的所有子树转换为为二叉树左子树。除去第一棵树的其他树转为二叉树的右子树

      B 二叉树转森林

        将二叉树的根作为第一个树的根,左子树转为第一棵树的子树,右子树转为其他树。

      森林的前序和后序对应二叉树的前序和中序

       

七、哈夫曼树

     1、定义

        哈弗曼树是给定n个值,这n个为叶子节点, 可以形成多个二叉树。带权路径最小的就为最优树,即为哈夫曼树。相当于权值越大的越靠近根节点。

     2、构造方法

        A 选择n个值中最小的两个,作为左右子树构建一个子树,根的权值为这两个相加。把根节点重新加入那个集合中。

        B 重复操作,直到最后一个

     3、实现

        可以使用数组来实现,但是选择最小权值的效率不是很高,可以使用最小堆

 

八、树的计数                      n

     有n个节点的树,有(1/(n+1))*C2n 

 
     
     
     
     
     
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: