这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
树,是我们很常见的一种数据结构,比如MySQL会使用的B+树,MongoDB会使用B-树。二叉树的算法题,也是在很多大公司的考察范围内,考察面试者对数据结构的理解。
树
概念定义
结点和边组成,不存在环的一种数据结构。如图
- 根结点:一个结点没有父结点,则为根结点
- 子节点: 一个节点含有的子树的根节点称为该节点的子节点
- 叶子结点:一个结点都没有子结点则为叶子结点
- 深度:结点的层次,从根结点开始计算。树中结点的最大层次树,就是树的深度(高度)
类型
- 二叉树:每个结点最多有2个结点 (如:哈夫曼树、霍夫曼树、最优二叉树)
- 完全二叉树:除了最后一层以外,其他层的结点个数都达到最大,并且最后一层的叶子结点都靠左(因和存储有关系)
- 满二叉树:只有最后一层没有子结点,其他所有层上的所有结点都有2个子结点的二叉树
-
二叉查找树:(如:红黑树、伸展树)
- 任意一个结点,其左子结点都小于此结点
- 任意一个结点,其右子结点都大于此结点
- 尽可能不出现2个结点的值相等情况
- 二叉查找树的中序遍历就可以输出一个从小到大的数据队列
数据结构
- 顺序存储法
- 链式存储法
二叉树的结点定义
//JavaScrip实现
function treeNode(val) {
this.val = val; // 当前结点的值
this.left = null; //指向左子节点
this.right = null; //指向右子节点
}
// Golang实现
type TreeNode struct {
val int
left *TreeNode
right *TreeNode
}
二叉树遍历
- 先序遍历:先根节点->遍历左子树->遍历右子树
- 中序遍历:遍历左子树->根节点->遍历右子树
- 后序遍历:遍历左子树->遍历右子树->根节点
- 层次遍历:按照树中的层次从左到右依次遍历每层中的结点