1.红黑树性质证明:从根到任意叶子的路径中,没有一条路径会比任何其他路径长到两倍
红黑树是一个自平衡查找二叉树,每个节点都由颜色标识(红或黑), 具有如下性质:
- 每个节点火或是红或是黑
- 每个叶子节点是黑的
- 如果一个节点是红的,则它如果有子节点则全是黑的
- 从某一个节点到达其子孙节点的每一条简单路径上包含相同个数的黑节点
- 根节点是黑色
证明: 根到任一个叶子的最短可能的路径上全是黑节点, 而最长路径根据性质3最坏的情况就是红黑节点交替,而又根据性质4 最长和最短路径上的黑节点数目相同,
则最长路径的长度应小于或等于最短路径的2倍
引理:
定义:从某个节点x出发(不包括该节点)到达一个叶节点的任意一条路径上,黑色节点的个数称为该节点的黑高度,记为bh(x)
红黑树的黑高度定义为bh(root).
定理:一棵含有n个节点的红黑树的高度至多为2log(n+1).
反着证明这个结论:对于高度为h的红黑树,它的包含的内节点个数至少为 2^{h/2}-1个,因为bh(x)>=h/2,
所以只要证明 它包含的内节点的个数至少为2^bh(x)-1个。
对红黑树的高度用数学归纳法证明,对于h=0,则内节点个数是0显然成立,对于节点x,其黑高度为bh(x),则其左右子树
的黑高度为 bh(x) 或者 bh(x)-1,但是高度减少至少1,因此由归纳假设知其内节点至少为 2^{bh(x)-1}个,从而总的内节点
至少为 2(2^{bh(x)-1}-1=2^{bh(x)}-1个. 结论得证
2.平衡二叉树
3.atoi实现
#include "stdafx.h" #include <iostream> int pow(int x, int y) { int t = x; int ret = 1; for (int i = y; i > 0; i /= 2) { if(i % 2 == 1) ret *= t; else t = t * t; } return ret; } int astringtointerger(const char* str) { int size = strlen(str); int sum = 0; for (int i = 0; i < size; ++i) { char c = str[i]; sum += (int)(c - '0') * pow(10, size - i - 1); } return sum; } int _tmain(int argc, _TCHAR* argv[]) { int j = astringtointerger("123"); std::cout << j; //atoi("123"); return 0; }
4.不使用模板实现不同链表的通用插入,删除,修改算法