树
- 是一种数据结构(如:目录结构)
- 是一种可以递归定义的数据结构
- 是由 n 个节点组成的集合
- 如果 n=0 ,那么是一颗空树
- 如果 n>0 ,那么存在 1 个节点作为树的根节点,其他节点可以分为 m 个集合,每个集合本身又是一棵树。
概念:
- 根节点(最顶端的节点)、叶子节点(没有孩子的节点,结构的最末端)
- 树的深度/高度(也就是树的层数)
- 节点度(也就是这个节点分了多少叉)
- 树的度(所有节点度的最大值)
- 孩子节点/父节点(看字面理解)
- 子树(根节点的字节点都是独立的树)
二叉树
度不超过 2 的树(节点最多有两个叉),它的孩子是有顺序的:左孩子,右孩子。
重点:满二叉树,完全二叉树
二叉树的存储方式
- 链式存储方式
- 顺序存储方式(列表)
- 面向对象的存储方式
父节点和左孩子节点的编号下标有什么关系?
0-1 1-3 2-5 3-7 4-9
规律:i = 2i+1
父节点和右孩子节点的编号下标有什么关系?
0-2 1-4 2-6 3-8 4-10
规律:i = 2i+2
比如,我们要找根节点左孩子的左孩子:(0*2+1)*2+1 = 3 (下标) 所以是6
面向对象的存储方式
1 | class BinTreeNode: |
- 前序遍历
1 |
|
- 中序遍历
1 | def MidBianli(root): |
- 后序遍历
1 | def PostBianli(root): |
在根据任意两个序列来推测第三个序列的时候,有中序比较好推测,因为能一眼看出二叉树的根
层级遍历
1 | def LevelBianli(root): |
二叉树小结
- 二叉树是度不超过 2 的树
- 满二叉树与完全二叉树
- (完全)二叉树可以用列表来存储,通过规律可以从父亲找到孩子或者孩子找到父亲
- 二叉树遍历方式 :
前序遍历
中序遍历
后序遍历