二叉树的应用

170 阅读3分钟

本文正在参加「金石计划 . 瓜分6万现金大奖」

二叉树的应用

前言

二叉树简要概括就是,一个拥有n个节点的有限集,同时拥有以下特征

  • 当n为0时,这个有限集被称为空树。

  • 当n>=1时有且只有一个根节点。

  • 当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每个集又是一棵树,称为根的子树。

  • 二叉树每个节点最多只拥有两个子节点分别为左右孩子节点。

树的基本介绍参考

算法入门之树简介

二叉树衍生出的各种特殊形式广泛应用于搜索和维持相对顺序,如二叉排序树。

二叉排序树介绍

二叉排序树很多索引就有使用类似结构,二叉排序树在二叉树定义的基础上增加如下定义

  • 如果左子树不为空,那么左子树上的任一节点值应该大于根节点的值。

  • 如果右子树不为空,那么右子树上的任一节点值应该小于根节点的值。

  • 左右子树都满足二叉排序树规则。

如下就是一棵标准的二叉排序树

image-20221114190646001.png

二叉排序树原理网站参考

二叉排序树又被称为二叉查找树,所以二叉排序树主要应用于查找,由于二叉排序树的定义,所以节点间有顺序而言,对于元素查询时间复杂度和树的深度有关,为O(logn)。

因为二叉排序树有顺序特点,所以当插入一个新元素时,会将其排序存放,如插入元素10,插入过程会有如下比较步骤

  1. 10 > 6,那么位于根节点的右子树。

  2. 10 > 8,那么位于节点8的右子树。

  3. 10 > 9,那么位于节点9的右孩子节点。

image.png

但正是因为二叉排序树有排序规则,所以如果插入顺序有如下场景,那么搜索时间复杂度会有O(logn)变为O(n)

插入顺序如下9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1

image.png

显然这种场景和插入顺序有很大关系,这时我们可以采用平衡二叉树(红黑树、AVL树等等)解决。

二叉树的遍历

二叉树的遍历是非常特殊的,为什么这么说呢?我们之前聊过的数组、链表其遍历方式都是按照某一个方向依次遍历即可,也就是线性遍历,而二叉树则不同,由于任一节点都可能存在两个分支,所以需要将非线性结构转换为线性结构遍历,遍历方法又称为两大类四小类。

  • 深度优先遍历(前序遍历、中序遍历、后续遍历)。

  • 广度优先遍历。

如下存在一颗二叉树,后面的遍历以这棵树为前提讲解

image.png

深度优先遍历

前序遍历

前序遍历其检索顺序为根节点、左孩子节点、右孩子节点。

所以检索结果为:5 、2 、1、3、6、7

中序遍历

中序遍历其检索顺序为左孩子节点、根节点、右孩子节点。

所以检索结果为:1、2、3、5、6、7

后序遍历

后续遍历其检索顺序为左孩子节点、右孩子节点、根节点。

所以检索结果为:1、3、2、7、6、5

广度优先遍历

广度优先遍历就是从上往下,从左往右遍历。

所以检索结果为:5、2、6、1、3、7