二叉树
简介
树, 非线性表结构
树有三个概念:
高度从下向上数, 起点是0
深度从上向下数, 起点是0
层数从上向下数, 起点是1
二叉树
每个节点最多两个叉
有两种特殊二叉树:
满二叉树, 除了叶子节点, 每个节点都有左右两个子节点
完全二叉树, 叶子节点都在最底下两层, 最后一层叶子节点都靠左排列, 且除了最后一层, 其它层节点个数都达到最大
满二叉树是完全二叉树的一种特殊情况
存储二叉树
- 基于指针的二叉链式存储法
每个节点三个字段, 一个存数据, 另外两个存左右子节点的指针, 这种方式比较常用, 大部分二叉树代码都是通过这种结构来实现的 - 基于数组的顺序存储法
把根节点存储在i=1的位置, 左子节点存在2i的位置, 右子节点存储在2i+1的位置, 以此类推
此种存储方式, 是完全二叉树的话, 只浪费一个下标0的存储位置, 非完全二叉树的话, 会浪费更多的数组存储空间
所以一个树是完全二叉树的话, 用数组存储是最节省内存的一种方式, 也是为什么完全二叉树被单拎出来说明的原因.
堆其实就是一种完全二叉树, 最常用的存储方式就是数组
二叉树的遍历
如何打印所有节点, 经典方法有三种:
前序遍历, 对于树中的任意节点来说, 先打印这个节点, 再打印左子树, 最后打印右子树 (todo)
中序遍历, 对于树中的任意节点来说, 先打印左子树,