二叉树
二叉树是一种重要的数据结构,与数组、向量、链表都是一种顺序容器,它们提供了按位置访问数据的手段。但是有一个缺点,它们都是按照位置来确定数据,想要通过值来获取数据,只能通过遍历的方式。而二叉树在很大程度上解决了这个缺点,二叉树是按值来保存元素,也按值来访问元素。
二叉树由一个个节点组成,一个节点最多只能有两个子节点,从根节点开始左右扩散,分左子节点和右子节点,向下一直分支。
许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树是递归定义的。
例子:从100亿条记录的文本文件中取出重复数最多的前10条,就是先通过哈希的方式分割成很多小模块,对各个小模块使用二叉树存储数据<value值,count个数>,最后遍历二叉树获取个数最大的前10条,然后在汇总比较。
二叉树的分类
满二叉树:从高到低,除了叶节点外,所以节点左右节点都存在。
完全二叉树:比满二叉树少几个叶节点,从左向右放子节点。
平衡二叉树:空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树也都是平衡树。
二叉搜索树:空树或者二叉树的所有节点比他的左子节点大,比他的右子节点小。
红黑树:不仅是具有二叉搜索树的属性,还具有平衡树的属性,有序且子树差不超过1,
红黑树 颜色规则:根节点和特殊节点(即叶节点下面两个虚无的节点和未填写的节点)是黑的,红节点的左右子节点是黑的,最重要的是对于每个节点,从该节点到子孙叶节点的所有路径包含相同数目的黑节点。
二叉查找树/二叉搜索树
定义:空树或者二叉树的所有节点比他的左子节点大,比他的右子节点小
二叉查找树的条件:
1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值;
2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值
3)左、右子树也分别为二叉排序树