05 - 二叉树的认识

2021-11-01  本文已影响0人  iOS之文一

数据结构和算法学习汇总

重点学习:

1、二叉树的认识
2、二叉树的遍历和构造
3、二叉树与森林的转换

树形结构是一对多的关系,而且树的定义是递归的,因为在树的定义中又用到树的定义。

定义:
树是由n(n>=0)个节点组成的有限集合,其中如果n=0,是一颗空树,如果n>0,这n个节点存在且仅存在一个节点作为树的根节点,其余节点可分为m个互不相交的有限集,其中每个子集本身又是一颗符合本定义的树,称为根的子树。
每一个节点可以有零个或多个后继节点,但有且只有一个前驱节点(根节点除外)。

1、树的基本概念

2、树的简单认识

2.1 存储结构

2.1.1 双亲存储结构

是一种顺序存储结构,在节点中存储节点的值,同时存放指向双亲节点的指针
优点是查找双亲方便

2.1.2 孩子链存储结构

是一种链式存储结构,在节点中存储节点的值,同时存放指向所有包含其所有孩子节点的指针。
指针域的个数就是树的度
优点是查找孩子方便

2.1.3 孩子兄弟链存储结构

是一种链式存储结构
有三个域

最大的优点是可以方便的实现树和二叉树的相互转换

基本运算

先根遍历:

后根遍历:

层次遍历:

二叉树的认识

定义

二叉树是有限的节点集合,这个集合或者是空,或者是由一个根节点和两颗互不相交的称为左子树和右子树的二叉树构成。

二叉树与度为2的树的差异

二叉树的类型

满二叉树

在一棵二叉树中,如果所有分支节点都有左孩子节点和右孩子节点,并且叶子节点都集中在二叉树的最下层,这样的二叉树就是满二叉树
满二叉树的高度为h,且有2^h-1个节点的

满二叉树.png

特点:

完全二叉树

若二叉树最多只有最下面两层的节点的度数小于2,并且最下面一层的叶子节点都一次排列在该层最左侧的位置上,这样的二叉树就是完全二叉树


完全二叉树.png

特点:

二叉查找树

二叉查找树的节点是有序的,也叫二叉搜索树、有序二叉树、排序二叉树。
若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值,若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值。


二叉查找树.png

特点:

优点: 因为有序所以便于查找

平衡二叉树

二叉树中任意一个节点的左右子树的高度相差不能大于 1,谓之平衡

特点:

1.平衡二叉树要么是一棵空树
2.要么保证左右子树的高度之差不大于 1
3.子树也必须是一颗平衡二叉树

红黑树(R-B Tree)

红黑树是一种自平衡的二叉查找树,它可以进行高效的查找。

它是为了解决普通二叉查找树在数据更新的过程中,复杂度退化的问题而产生的,时间复杂度为O(lgn)。

红黑树.png

特点:

1.每个节点或者是黑色,或者是红色
2.根节点是黑色
3.每个叶子节点(NIL)是黑色。[注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
4.如果一个节点是红色的,则它的子节点必须是黑色的
5.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。因为需要更加平衡

二叉树的性质

二叉树与树、森林之间的转换

树、森林转换为二叉树

过程:

  1. 第一个颗树的根节点作为二叉树的根节点
  2. 一棵树中的一个分支节点的最左边孩子节点作为左孩子节点
  3. 一个节点的兄弟节点都作为自己的右孩子节点
    1. 如果有多个兄弟,就把下一个兄弟节点作为自己的右孩子节点
    2. 下一个兄弟节点再把自己的下个兄弟节点作为自己的右孩子节点
  4. 下一棵树的根节点作为上一棵树的根节点的右孩子节点

示例

转化前:

转化前森林.png

转化后

转化后二叉树.png

二叉树转换为森林、树

将上面的反过来就可以

  1. 把一棵树的根节点的所有左孩子节点作为一棵树
    1. 将左节点作为自己的左孩子节点,将左孩子节点的右孩子节点作为其兄弟节点
    2. 将左节点的左孩子节点作为自己的左孩子节点
  2. 将根节点的右孩子节点作为一棵树的根节点
    1. 也同样的方式查找自己的左右孩子节点

存储结构

有两种,顺序存储二叉树和链式存储二叉树,一般使用链式存储结构,如果是完全二叉树可以使用顺序存储结构。

顺序存储二叉树

顺序存储结构.png

说明:

使用:

特点: 查询快,增删慢

链式存储二叉树

每个节点存储有节点数据、左孩子节点指针、右孩子指针


节点结构.png 链式存储结构.png

说明:

特点: 增删快

二叉树的构造

构造原理:
同一棵树有唯一的先序序列、中序序列、后序序列,但是不同的二叉树可能有相同的先序序列、中序序列、后序序列,
所以如何根据这些序列来构造二叉树呢,需要中序序列加上先序序列(或后序序列),这是因为先序或后序会确定根节点,中序序列会确定左右孩子节点,以此来确定二叉树。

中序序列+先序序列

中序序列+后序序列

案例:
先序序列为:ABC
中序序列为:ACB

说明:

案例.png

二叉树的遍历

遍历是指访问二叉树中所有节点,并且每个节点只访问一次
根节点可以放在先、中,后三个地方、又因为左右子树的顺序不一样,所以可以分为六种遍历方式,再加上层次遍历,共有七种

下面以先左子树,后右子树的方式来说明

先序遍历
1、先访问根节点
2、先序遍历左子树
3、先序遍历右子树

中序遍历
1、中序遍历左子树
2、访问根节点
3、中序遍历右子树

后序遍历
1、后序遍历左子树
2、后序遍历右子树
3、访问根节点

层次遍历
1、访问根节点
2、依次访问第二层、第三层

案例

二叉树的遍历.png

先序遍历:1、2、4、5、7、8、3、6
中序遍历:4、2、7、5、8、1、3、6
后序遍历:4、7、8、5、2、6、3、1
层次遍历:1、2、3、4、5、6、7、8

上一篇 下一篇

猜你喜欢

热点阅读