数据结构与算法4(各种二叉树)

各种二叉树

    • 二叉树
      • 二叉树的性质
      • 二叉树的操作
      • 二叉树的存储
      • 二叉树的遍历
      • 二叉树的存储
    • 有序二叉树
    • 二叉树的常考的笔试面试题
    • 线索二叉树
    • 选择树
    • 平衡二叉树
    • 红黑树

二叉树

  是一种常用的数据结构,处理起来比较简单方便,而且普通树可以很方便地转换成二叉树使用。

  定义:节点度最多为2

    二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。

二叉树的性质

  性质1二叉树的第i层上至多有2^(i-1)(i≥1)个节点。

  满二叉树:每层的节点数都是2^(i-1)

  完全二叉树:

    1、深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称为完全二叉树。

    2、除了最后一层外,其余每一层都是满的,最后一层的节点必须从左到右分布,就是完全二叉树

    3、如果所有的节点都满足从上到下、从左到右分布,就是完全二叉树

  性质2深度为h的二叉树中至多含有2^h-1个节点 。

  性质3若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1。

  性质4具有n个节点的完全二叉树深为log2x+1(其中x表示不大于n的最大整数)。

  性质5若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:

    当i=1时,该节点为根,它无双亲节点。

    当i>1时,该节点的双亲节点的编号为i/2。

    若2i≤n,则有编号为2i的左节点,否则没有左节点。

    若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点。

二叉树的操作

​  构建、销毁、遍历、高度、密度、插入、删除、求左、求右、求根

二叉树的存储

  顺序:必须按照完全二叉树的格式进行存储,如果有空位置使用特殊数据代替

    数据项:

    存储节点的首地址

    容量

二叉树的遍历

  前序:根 左 右

  中序:左 根 右

  后序:左 右 根

  注意:前中后由根节点决定,并且左右子树的次序不能改变

  注意:根据前序+中序 或者 后序+中序 可以还原出一棵树,但是前序+后序是无法还原的

​  层序遍历:从上到下,从左到右来遍历一棵树,必须配合队列时使用

二叉树的存储

​  顺序:必须按照完全二叉树的格式存储节点,空位置使用特殊数据替代

​  ​  数据项:

​  ​  存储节点的内存首地址

​  ​  容量

​  注意:通过编号的关系来找到双亲、孩子节点

​  链式:由一个个节点组成,通过左右子树指针指向自己的左右子树

​  ​  节点数据项:

​  ​  数据

​  ​  左子树指针

​  ​  右子树指针

有序二叉树

(二叉排序树、二叉查找树、二叉搜索树)

​  左子树的数据小于根,右子树大于等于根,这种树叫做有序二叉树

​  注意:由于有序二叉树的节点需要频繁地插入删除,因此不适合采用顺序存储

​​  有序二叉树的中序遍历,一定是从小到大,所以有序二叉树也是一种排序算法,它的查找天然又是二分查找,所以经常考。

二叉树的常考的笔试面试题

​  1、把一颗二叉树转换为它的镜像树

​  2、输入两棵二叉树A、B,判断B是不是A的子结构(我们约定空树不是任意一棵树的子结构)

​​  3、计算出有序二叉树中倒数第K大的数

​  4、判断一颗二叉树是否是对称的

​​  5、将一块有序二叉树转换为一个有序的双向循环链表

​  6、通过一个函数,把一棵二叉树按照之字形打印,即第一层从左往右打印,第二层从右往左打印,第三层又从左往右打印,一次类推。【使用两个栈】

线索二叉树

​  规律:在有n个节点的链式二叉树中,必定有n+1个空指针域

​  链式二叉树中有很多的空指针,可以让这些指针的一部分指向下一个节点,这样遍历树时可以不用递归而是使用循环,提高树的遍历速度

​​  中序线索二叉树:

​  ​  节点数据项:

​  ​  数据

​  ​  左子树指针

​  ​  右子树指针

​  ​  右子树指针标志(真表示指向的是下一个节点,假表示指向的就是右子树)

​  实现过程:

​  ​  1、创建线索

​  ​  2、按照线索进行遍历

​  注意:线索二叉树的主要目的是为了提高树的遍历速度

选择树

(胜者树、败者树)

​  是一棵完全二叉树,把待比较的数据存储在最后一层,根节点是左右子树中的一个,是它们的最大或最小的作为根,选择树的功能是能够方便地找出树中的最大值或者最小值。

​​  是一种完全二叉树:不适合链式存储

​  大顶堆(大根堆):根节点比左右子树大

​  小顶堆(小根堆):根节点比左右子树小

​  数据项:

​  ​  存储数据的内存首地址

​  ​  容量

​  ​  数量

​  运算:

​  ​  创建、添加、删除、空堆、满堆、堆顶

​  使用堆可以实现优先队列

平衡二叉树

​  前提是有序的二叉树,它的左右子树的高度差不超过1,而且所有它的所有子树也要满足这个条件。

​  如果一棵有序二叉树呈单支状(接近单支状),它的查找效率接近链表,因此如果让他达到平衡的状态,它的效率才最高
​  由于节点的位置是受值得影响,因此只能进行调整,而不能强行修改

​  二叉树不平衡的基础原因:

          x                                        y
         / \                                      / \
        y  t1          以y为轴向右旋转            z   x
       / \                                     / \   / \
      z  t2                                   t3 t4 t2 t1
     / \
    t3 t4  


          x                                        y
       	 / \                      				  / \
        t1  y           以y为轴向左旋转           x   z
           / \                                 / \   / \
          t2  z                               t1 t2 t3 t4
             / \
            t3  t4


          x                    x                   z
         / \                  / \                 / \
        y  t1                z   t1              y   x
       / \                  / \                / \   / \
      t2  z                y   t4             t2 t3 t4 t1
         / \              / \
        t3 t4            t2  t3 
	以z为轴向左旋转        以z为轴向右旋转         最终达到平衡

          x                    x                   z
         / \                  / \                 / \
        t1  y                t1  z               x   y
           / \                  / \            / \   / \
          z   t2               t3  y          t1 t3 t4 t2
         / \                       / \
        t3  t4                    t4 t2
	以z为轴向右旋转		  以z为轴向左旋转		 最终达到平衡

红黑树

​  也是一种自平衡的有序二叉树,它不是根据子树的高度差来调整平衡的,而是给每个节点设置红或黑两种颜色,以此达到平衡。

​  优点:插入、删除的效率要比AVL树要高

​  缺点:没有AVL树均匀,查找效率没有AVL树高

你可能感兴趣的:(c语言,二叉树,数据结构)