二叉树

树的基本概念

树是由n(n>0)个有限节点组成的一个具有层次关系的集合,它具有以下的特点:

  • 每个节点有0个或多个结点
  • 没有父节点的节点叫做根节点
  • 每个非根节点有且只有一个父节点
  • 除了根节点外,每个子节点可以分为多个不相交的子树

1

节点的度: 节点拥有的子树个数,可以理解为节点的子节点个数,例如图中节点A的度为2,节点H的度为1

树的度: 树的度即为最大节点的度,例如图中最大的节点B的度为3,所以树的度为3

叶子节点: 度为0的节点,可以理解为没有子节点的节点,图中K,J,F,L,O,P都是叶节点

父节点: 一个含有子节点的节点。图中A节点就是B 和 C的父节点

子节点: 一个含有子树的根节点的节点,把子树的根节点叫做该节点的该节点的子节点,图中节点G和节点H为节点C的子节点

兄弟节点: 具有相同父节点的节点,节点B和节点C就是兄弟节点

祖先节点: 从根到该节点所经分支的所有节点,图中节点A,B,E是节点J的祖先节点

子孙节点: 以某节点为根节点的子树中所有节点,图中节点D、E、F、J、K、I是节点B的子孙节点

节点层次: 以根开始,根为第一层,根的子节点为第二层…,如果一个节点在第n层,则它的子树的根节点在n+1层

深度或高度: 树中节点的最大层次

森林: 由n棵互不相交的树的集合,例如图中节点A去掉,以节点B为根的树和以节点C为根的树组成的集合就叫做森林

二叉树

二叉树的基本概念

二叉树是每个节点最多只有两个子树(子节点)的树结构,所以子节点也可能是0个或1个,这两种子树通常叫做左子树和右子树,具有左右次序,不能颠倒

满二叉树

如果一棵二叉树,除叶子节点外,所有的节点都存在左节点和右节点,并且所有叶子节点都在同一层上,那这棵二叉树称为满二叉树。如图所示: 2

满二叉树的特点:

  • 满二叉树第i层有2^(i-1)个节点
  • 深度为k的满二叉树总共有 2^k - 1 个节点

完全二叉树

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。堆就是一棵完全二叉树。4

二叉搜索树(BST)

前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树又称二叉排序树。

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉排序树

下面这两棵都是搜索树 4

平衡二叉搜索树

平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。如图: 5 最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。

二叉树的存储方式

二叉树可以链式存储,也可以顺序存储。

那么链式存储方式就用指针, 顺序存储的方式就是用数组。

顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。

链式存储如图: 6

顺序存储的方式是按树的一层一层来存,如图: 7

用数组来存储二叉树如何遍历的呢?
如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。
但是用链式表示的二叉树,更有利于我们理解,所以一般我们都是用链式存储二叉树。
所以大家要了解,用数组依然可以表示二叉树。

二叉树的遍历方式

二叉树主要有两种遍历方式:

  1. 深度优先遍历:先往深走,遇到叶子节点再往回走。
    • 前序遍历(递归法,迭代法)
    • 中序遍历(递归法,迭代法)
    • 后序遍历(递归法,迭代法)
  2. 广度优先遍历:一层一层的去遍历。
    • 层次遍历(迭代法)

深度优先遍历的前中后,其实指的就是中间节点的遍历顺序,只要记住,前中后指的是中间节点的位置就可以了。

  • 前序遍历:中左右
  • 中序遍历:左中右
  • 后序遍历:左右中

8

注意:

  • 前序遍历的根节点在第一个
  • 后序遍历的根节点再最后一个
  • 中序遍历的根节点在遍历结果中间某个位置,并将结果分割为左右子树的中序遍历
  • 二叉搜索树「中序遍历」得到的值构成的序列一定是升序的。