【C++学习笔记】 :二叉树的基础入门知识

190 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

1、写在前面

大家好,今天文章的内容是:

  • 二叉树的基础知识

2、内容

2.1、种类

(1) 满二叉树

如果在一个二叉树中,只有度为0和度为2的结点,并且度为0的结点都在同一层,任意层次的结点个数都达到了最大值,我们将这样的二叉树称为满二叉树。

比如:

image.png

如果满二叉树的某一层的深度为kk,则该层应有2k12^{k-1}个结点。

(2) 完全二叉树

如果在一个二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最底层的结点都集中在该层最左边的连续位置上。那么我们就称这个二叉树为完全二叉树。

比如:

image.png

(3) 二叉搜索树

二叉搜索树是一种有序树,其定义如下:

  1. 若它的左子树不空,则左子树上所有结点的值都小于它的根结点的值;
  2. 若它的右子树不空,则右子树上所有结点的值都大于它的根结点的值;
  3. 左、右子树都分别是二叉搜索树

比如:

image.png

(4) 平衡二叉搜索树

如果在一颗二叉树中,左右子树的高度差绝对值不超过1,并且左右两个子树都是一颗平衡二叉树,那么我们称这个二叉树为平衡二叉搜索树,又称AVL(Adelson-Velsky and Landis)树。

比如:

image.png

image.png

image.png

2.2、存储结构

(1) 顺序存储

顺序存储的方式就是用数组,其存储的元素在内存是连续分布的

image.png

比如上述二叉树就可以用一个数组来表示,如下所示:

image.png

二叉树之所以可以用数组来存储,是因为二叉树的性质:

如果对一颗有nn个结点的完全二叉树按层次自上而下(每层从左到右)对结点进行编号(从11nn),则对任意结点ii而言:

  • 如果结点的编号ii等于11,则结点ii为根结点(没有父结点)
  • 如果ii大于11,则该结点ii的父节点编号为i/2i/2
  • 如果2i2i小于或等于nn,则ii的左孩子的编号为2i2i,否则ii无左孩子
  • 如果2i+12i+1小于或等于nn,则ii的右孩子的编号为2i+12i+1,否则ii无右孩子。

image.png

如上图所示,完全二叉树中有9个结点,即n=9n=9。举个例子,比如编号ii为4的结点为DD,又因为 2in2i≤n,即898≤9,所以结点DD的左孩子的编号为2i=82i=8(也就是HH),可以观察到,上图中结点 DD 的左孩子确实是HH

像这样,从上而下,从左到右地将二叉树的结点存储下来,并利用二叉树性质,就可以轻松地体现二叉树各个结点之间的逻辑关系。这就是二叉树的顺序存储结构。

(2) 链式存储

当我们采取链式存储结构来存储二叉树时,每个结点除了存储数据元素本身的值data外,还需要设置两个指针,分别用于指向左、右子树。当任意结点的某个子树为空时,对应的指针就可以设置为NULL

image.png

image.png

2.3、遍历运算

掌握二叉树的遍历运算也很重要,对于二叉树而言,遍历运算主要分为两种:深度优先遍历(先往深走,遇到叶子节点再往回走)和广度优先遍历(一层一层的去遍历)。

比如,现在有一颗二叉树如下图所示:

image.png

那么有如下遍历方式:

(1) 深度优先遍历

  • 前序遍历:[ABDHIECFGA、B、D、H、I、E、C、F、G]
  • 中序遍历:[HDIBEAFCGH、D、I、B、E、A、F、C、G]
  • 后序遍历:[HIDEBFGCAH、I、D、E、B、F、G、C、A]

(2) 广度优先遍历

  • 层次遍历:[ABCDEFGHIA、B、C、D、E、F、G、H、I]

3、写在最后

好了,文章的内容就到这里,感谢观看。