二叉树

来源:互联网 发布:淘宝设计教程 编辑:程序博客网 时间:2024/06/05 06:17

基本概念


分类

  • 二叉树:任何节点最多只有两个子节点
  • 满二叉树:所有能有两个节点的地方都有两个节点
  • 完全二叉树:只有最后一层右边差若干节点
  • 二叉搜索树:左子树中每一个节点的键值<自己<右子树中每个节点的键值,可以提供lg(n)时间复杂度的元素插入与访问。当树退化成链表结构,复杂度就变成了n。插入:从根节点开始,遇大键值则向左,遇小键值则向右,至叶子节点处插入。删除:只有一个子节点,直接将子节点连至父节点;有两个子节点,取右子树中的最小值(一直向左走到底)取而代之。
  • 平衡二叉搜索树:插入删除平均时间长,搜索快,包括AVL-tree、RB-tree、AA-tree。

遍历

  • 先序遍历也叫做先根遍历、前序遍历,可记做根左右(二叉树父结点向下先左后右)。
  • 中序遍历也叫做中根遍历、中序周游。在二叉树中,先左后根再右。巧记:左根右。
  • 后序遍历也叫做后根遍历、后序周游,可记做左右根。后序遍历有递归算法和非递归算法两种。在二叉树中,先左后右再根。巧记:左右根。

术语

  • 节点大小:所有子节点+自己的节点总数
  • 节点高度:到最深子节点的路径长度
  • 节点深度:根节点到自己的路径长度

AVL tree

定义:任何节点左右子树高度相差最多为1
实现:当新插入一个节点,树的平衡被打破,需要重新选择根节点来恢复平衡。设X为平衡被破坏的节点中最深的一个,考虑以X为根的子树。如果插入点在X的左子节点的左子树,选择X左子节点作为根节点进行单旋转;如果插入点在X的右子节点的右子树,选择X右子节点作为根节点进行单旋转。如果插入点在X的左子节点的右子树,选择左子节点的右子树根节点作为根节点,由两次单旋转完成,称双旋转。如果插入点在X右子树的左子树,选择右子树的左子树根节点作为根节点。
问题:如何将保持一颗二叉树的平衡的问题,转化为插入的节点在X的左左、左右、右左、右右四种情况?


RB tree 红黑树

红黑树源于2-3树,用于C++ STL中的set、map,以及Linux虚拟内存的管理。
http://blog.csdn.net/yang_yulei/article/details/26066409


什么是2-3树


什么是红黑树

定义:

  1. 每个节点不是红色就是黑色
  2. 根节点为黑色
  3. 如果红节点的子节点为黑
  4. 任一节点至子树叶子节点的路径上,所含黑节点数相同。对于左(右)节点为空的情况,添加空节点,认为是黑色的。如果新增节点是黑色的,那么新增节点到父(祖父、祖祖父)节点的路径上黑节点数目就+1了,与其他叶子节点的距离不一致,因此新增节点必为红色。

如何从2-3树到红黑树,相较于2-3树,红黑树的优势