目录
0.前言
二叉树在数据结构(即DS)当中有很重要的意义,在整个初阶DS当中二叉树的难度和占比都是很大一部分的,二叉树的单独基础概念我会单独开一篇文章去讲述,同时这样也方便大家不用往下划找的头疼,废话不多说我们立刻开始。
1.二叉树的分类
1、完全二叉树
- 假设二叉树的高度为h,除第 h 层外,其它各层 (1 -> h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。如图:
- 注意!!完全二叉树一定是从左到右依次排布,如果从左到右当中出现了没有左子树,但是存在右子树的情况,那么这个就不是完全二叉树。
- 同时堆也是一种完全二叉树!
2、满二叉树
满二叉树在国内的定义与国际上满二叉树的定义有些稍微不同,那么我们就按照国内对满二叉树的定义来。
- 国内对满二叉树定义:除了叶子节点外每一个节点都有它的左右节点并且叶子节点都在二叉树的最底层。
Tip:满二叉树也是一种特殊的完全二叉树!
3、只有左(右)子树:
定义:只有左边或者右边一直延伸的树。如图:
4、平衡二叉树
- 定义:假设一棵树是空树或者它的任意一个节点上的左右子树高度差的绝对值不超过1,我们就叫它为平衡二叉树。如图:
2.二叉树的实现(搜索树)
1、二叉树的功能声明
首先我们要实现一个二叉树,我们得要知道二叉树要实现的什么样的功能,所以我们先定下要实现基本的搜索功能。如下
//数组 //传入的数字 //数组下标
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi);
// 二叉树销毁
void BinaryTreeDestory(BTNode** root);
// 二叉树节点个数
int BinaryTreeSize(BTNode* root);
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root);
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root);
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root);
二叉树创建、查找节点个数以及核心的前中后序的遍历。
那么什么是前中后序遍历呢?
- 前序遍历:访问节点内容->左节点->右节点,依次按照这样的顺序访问。
- 中序遍历:访问左节点->节点内容->右节点,依次按照这样的顺序访问。