zoukankan      html  css  js  c++  java
  • 树与二叉树详解

    树与二叉树

    树是n(n≥0)个结点的有限集合,n=0时称为空树,在任一非空树中
    ● 有且仅有一个称为根的结点。
    ● 其余的结点可分为m(m≥0)个互不相交的子集T1,T2…,Tm, 其中每个子集本身又是一棵树,并称其为根结点的子树。

    1. 树的基本概念
      ● 双亲和孩子
      ● 兄弟:具有相同双亲的结点互为兄弟。
      ● 结点的度:一个结点的子树的个数记为该结点的度。
      ● 树的度:树中各结点的度的最大值
      ● 叶子结点:也称为终端结点,指度为零的结点。
      ● 内部结点:度不为零的结点称为分支结点或非终端结点。除根结点之外,分支结点也称为内部结点。
      ● 结点的层次:根为第一层,根的孩子为第二层,依此类推。
      ● 树的高度:一棵树的最大层次数记为树的高度(或深度)。
      ● 有序(无序)树:若将树中的结点的各子树看成是从左到右 具有次序的,即不能交换,则称该树为有序树,否则称为无序树。
      ● 森林:是m(m≥O)棵互不相交的树的集合

    2. 树的存储结构
      ● 标准存储结构
      (1) 结点的数据
      (2)指向子结点的指针
      ● 带逆存储结构
      (1)结点的数据
      (2)指向子结点的指针
      (3)指向其父结点的指针

    3. 树的遍历
      遍历是指对树中所有结点信息的访问,即依次对树中每个结点访问一次且仅访问一次。
      在这里插入图片描述
      ● 前序遍历A B E F I J C D G H
      ● 后序遍历E I J F B C G H D A
      ● 层次遍历A B C D E F G H I J

    二叉树

    1. 二叉树(BinaryTree)是n(n≥o)个结点的有限集合,它或者是空树 (n=0),或者是由一个根结点及两棵互不相交的、分别称为左 子树和右子树的二叉树所组成。

    2. 二叉树与树的区别:
      ● 二叉树的结点的最大度为2,而树中不限制结点的度。
      ● 二叉树的结点的子树要区分左子树和右子树

    3. 二叉树的性质
      (1)二叉树第i层上的结点数目最多为2i-1(i≥1)。
      (2)深度为k的二叉树至多有2k-1个结点(k≥1)。
      (3)在任意一棵二叉树中,若终端结点数为n0,度为2的结点 数为n2,则n0=n2+1。
      (4)具有n个结点的完全二叉树的深度为⌊log2n」+1。
      (5)对一棵有n个结点的完全二叉树的结点按层次自左至右进行 编号,则对任一结点i有:
      ●若i=1,则结点 i是二叉树的根,无双亲,若i>1,则其双 亲为⌊ i/2 」。
      ● 若2i>n,则结点i无左孩子,否则其左孩子为 2i。
      ● 若2i+1>n,则结点i无右孩子,否则其右孩子为 2i+1
      若深度为k的二叉树有2k-1个结点,则称其为满二叉树。
      深度为k、有n个结点的二叉树,当且仅当其每一个结点都与 深度为k的满二叉树编号从1至n的结点一一对应时,称之为完全二叉树。
      在这里插入图片描述

    4. 二叉树的存储结构
      (1)顺序存储结构
      对完全二叉树既简单又节省空间,而对于一般二叉树则不 适用。
      (2)链式存储结构
      由于二叉树中结点包含有数据元素、左子树根、右子树根 及双亲等信息,因此可以用三叉链表或二叉链袭来存储二叉 树。链表的头指针指向二叉树的根结点。

    5. 二叉树的遍历
      前序遍历:先访问根节点——左子树——右子树。
      中序遍历:先访问左子树——根节点——右子树,按照这个顺序。
      后序遍历:和前面差不多,先访问树的左子树——右子树——根节点。
      按层遍历:把一棵树从上到下,从左到右依次写出来。
      在这里插入图片描述

    二叉排序树

    又称为二叉查找树,定义:或者是一棵空树,或者是具有下列性质的二叉树:
    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    (2)若右子树不空,则右子树上所有结点 的值均大于或等于它的根结点的值;
    (3)左、右子树也分别为二叉排序树;
    在这里插入图片描述

    平衡二叉树

    又被称为AVL树,具有以下性质:它是一棵空树或它的左右 两个子树的高度差的绝对值不超过1,并且左右两个子树都是 一棵平衡二叉树。
    在这里插入图片描述

    线索树

    n个结点的二叉链表中含有n+1 (2n-(n-1)=n+1)个空指针域。
    利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。

    在这里插入图片描述

    最优二叉树

    给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路 径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树, 权值较大的结点离根较近。

    例:{7,8,9,10,19}构造哈夫曼树
    第一步:创建森林,森林包括5棵树,这5棵树的权值是7,8,9,10,19
    在这里插入图片描述
    第二步:在森林中,选择根节点权值最小的两棵树7和8进行合并,将它们作为一颗新树的左右孩子,新树的权值是左右孩子的权值之和,新树的权值是15。 然后,将树7和树8从森林中删除,并将新的树(树11)添加到森林中。
    在这里插入图片描述
    第三步:在森林中,选择根节点权值最小的两棵树9,10进行合并。得到的新树的权值是19, 然后,将树9和树10从森林中删除,并将新的树19添加到森林中。
    在这里插入图片描述
    第四步:在森林中,选择根节点权值最小的两棵树15,19进行合并。得到的新树的权值是34。 然后,将树15和树19从森林中删除,并将新的树34添加到森林中。
    在这里插入图片描述
    第五步:在森林中,选择根节点权值最小的两棵树19和34进行合并。得到的新树的权值是53。 然后,将树19和树34从森林中删除,并将新的树53添加到森林中。
    在这里插入图片描述
    此时,森林中只有一棵树53。

    关于树,大体上就这么多。

    欢迎查阅
  • 相关阅读:
    在cnBlogs上使用MarsEdit发blog
    如何将netbeans生成的项目文件打包发布到其他的Tomcat服务器上?
    Android activity中单击返回键或home键彻底退出应用
    C语言基础之自增自减运算符及注意事项
    [给自己扫盲]名词解释——LAMP、MEAN、Web应用框架等
    第一个Mac程序——倒计时v1&v2
    iOS开发 Swift开发数独游戏(二)数独题目的生成
    解决ADT大量出现"Unexpected value from nativeGetEnabledTags: 0"的问题
    C语言基础之指针
    [给自己扫盲]Node.js 究竟是什么?
  • 原文地址:https://www.cnblogs.com/gh110/p/11827701.html
Copyright © 2011-2022 走看看