树和二叉树
- Node 节点
-
- 父节点地址
-
- 值
-
- 左子节点地址值
-
- 右子节点地址值
- 度
-
- 每一个节点的子节点数量
- 二叉树
-
- 任意节点的度<=2
- 树高
-
- 树度总层数
- 根节点
-
- 最顶层的节点
- 左子节点
-
- 左下方的节点
- 右子节点
-
- 右下方的节点
- 根节点的左子树
-
- 根节点左子节点和下面的所有节点
- 根节点的右子树
-
- 根节点右子节点和下面的所有节点
二叉查找树
- 二叉树查找树,又称二叉排序树或者二叉搜索树
- 特点
-
- 每一个节点上最多有两个子节点
-
- 任意节点左子树上的值都小于当前节点
-
- 任意节点右子树上的值都大于当前节点
- 添加节点的规则
-
- 小的存左边
-
- 大的存右边
-
- 一样的不存
二叉树的遍历方式
前序遍历
- 从根节点开始,按照当前节点,左子节点,右子节点的顺序遍历
-
20 18 16 19 23 22 24
中序遍历
- 从最左边的子节点开始,按照左子节点,当前节点,右子节点的顺序遍历
-
16 18 19 20 22 23 24
后序遍历
- 从最左边的子节点开始,按照左子节点,右子节点,当前节点的顺序遍历
-
16 19 18 22 24 23 20
层序遍历
- 从根节点开始一层一层的遍历
-
20 18 23 16 29 22 24
二叉查找树的弊端
按照规则将下列节点添加到二叉查找树中:7 10 11 12 13
- 查询效率太低(eg:查询13)
平衡二叉树
- 规则:任意节点左右子树高度差不超过1
平衡二叉树的旋转机制
- 规则1: 左旋
- 规则2: 右旋
- 触发时机:当添加一个节点之后,该树不再是一颗平衡二叉树
左旋
确定支点:从添加的节点开始,不断的往父节点找不平衡的点
步骤A:
- 以不平衡的点作为支点
- 把支点左旋降级,变成左子节点
- 晋升原来的右子节点
步骤B:
- 以不平衡的点作为支点
- 讲根节点的右侧往左拉
- 原先的右子节点变成新的父节点,并把多余的左子节点让出,给已经降级的根节点当右节点
右旋
同理
需要旋转的四种情况
左左
- 当根节点左子树的左子树有节点插入,导致二叉树不平衡
-
- 一次右旋
左右
- 当根节点左子树的右子树有节点插入,导致二叉树不平衡
-
- 先局部左旋,再整体右旋
右右
-
- 当根节点右子树的右子树有节点插入,导致二叉树不平衡
-
- 一次左旋
右左
-
- 当根节点右子树的左子树有节点插入,导致二叉树不平衡
-
- 先局部右旋,再整体左旋