算法补充|青训营笔记

49 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

红黑树

红黑树:二叉排序树BST的进化,不是平衡二叉树AVL(左-右绝对值小于1)两者查找插入删除都是O(logn),比avl树好写效率还高(比avl旋转少)

根是黑色,

空叶子是黑色,

红的孩子是黑的(到根路径上红色必不多于黑色,总路径长度在一倍黑色路径到两倍黑色路径之间,所以叶子节点的路径长度均在相同大致范围内)

空叶子到根所经历的黑色结点数相同,路径上黑色结点称为黑色路径

总路径=红色路径长度+黑色路径长度

红黑树的插入:待插入结点是红色

      若直接就是根,则染黑

      若插入位置的父亲是黑色则直接插入(例如插入8)

若父亲是红,叔叔是红(例如插入15),则父亲叔叔染黑,爷爷变红,再把爷爷当成新插入的点处理(若爷爷是根,则直接染黑)

若父亲是红,叔叔是黑(叶子NULL也算)且成>型,则先调整成一顺(同avl),再整体旋转(同avl),旋转前后各叶子结点黑色路径数不变,再单独调整各节点即可

lambda表达式

lambda表达式功能:以算法谓词的形式指定算法的操作(sort的顺序逆序)、传值或引用的方式捕捉作用域内的变量

auto add_x = [x](int a) { return a + x; }; // 复制捕捉x,lambda表达式无法修改x,即x++

使用mutable关键字可以修改副本,但是也修改不了值本身

auto add_x = [=](int a) mutable {x++;}

auto multiply_x = [&x](int a) { return a * x; }; // 引用捕捉x,可以修改x

例:

int val = 3;

vector v {1, 8, 5, 3, 6, 10};

int count = std::count_if(v.beigin(), v.end(), [val](int x) { return x > val; });

NULL和nullptr

NULL的本质是0,在c中是(void*)0,在c++中就是0,nullptr是关键字,防止fun(NULL)会调用fun(0)