第六章 二叉树理论基础
一、二叉树分类
二叉树的分类为:
- 满二叉树
如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
这棵二叉树为满二叉树,也可以说深度为k,有2^k-1
个节点的二叉树。
- 完全二叉树
完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h -1
个节点。
- 二叉搜索树
二叉搜索树是有数值的了,二叉搜索树是一个有序树。
- 平衡二叉搜索树
平衡二叉搜索树:又被称为AVL
(Adelson-Velsky and Landis)树,它是一棵空树,它的左右两个子树高度差的绝对值不超过1,并且左右子树都是一棵平衡二叉树。
C++中map
、set
、multimap
,multiset
的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map
、unordered_set
,unordered_map
、unordered_map
底层实现是哈希表。
二、二叉树的存储方式
二叉树既可以 链式存储,也可以 顺序存储。
- 链式存储:用指针
- 顺序存储:用数组
三、二叉树的遍历方式
基于图论的二叉树主要有两种遍历方式:
- 深度优先遍历(
栈实现
)
先往深处遍历,遇到叶子结点再往回遍历
- 广度优先遍历(
队列实现
)
一层一层地遍历
四、二叉树的定义
二叉树节点定义:(有点类似于链表)
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
//这是一个构造函数,构造函数也可以不写,
//但是new一个新的节点的时候就比较麻烦。
TreeNode(int val):val(val),left(NULL),right(NULL){
}
};
五、题型总结
对二叉树的遍历顺序进行分类:
- 一定选前序遍历(涉及二叉树的构造):先构造中间节点,再通过递归函数的返回值来添加删除节点。
- 一定选择后序遍历(求普通二叉树的属性): 一般通过递归函数的返回值来做计算。
- 一定选择中序遍历(求二叉搜索树的属性):利用二叉搜索树的特性。