二叉树

树 - 图1

二叉树查找

核心:递归判断大小 大走右节点 小走左节点

  1. function find(node, value) {
  2. if(node === null) return null;
  3. if(node.value < value) find(node.right, value)
  4. if(node.value > value) find(node.left, value)
  5. else return value;
  6. }

遍历二叉树

核心: 中序遍历二叉树

  1. function dfs(node) {
  2. if(!node) return;
  3. dfs(node.left);
  4. console.log(node.value);
  5. dfs(node.right);
  6. }

二三树

核心: 正常2叉树 都是一个2 节点 二三树引入了三节点 来树 平衡,让树的深度都是一样的, 让查找复杂度都是logn, (二叉树查找复杂度 最差情况下是n 1->2->3->4->5)

红黑树

核心: 将红链 展平就是二三树, 利用一些规则来让树平衡
树 - 图2
规则: 如下图
树 - 图3
红黑树插入算法实现

  1. function rotate(node,direction) {
  2. const oppDirection = direction ==='left' ? 'right' : 'left'
  3. const tempNode = node[oppDirection];
  4. node[oppDirection] = tempNode[direction];
  5. tempNode[direction] = node;
  6. tempNode.color = 'black';
  7. tempNode[direction].color = 'red';
  8. return tempNode
  9. }
  10. function isRed(node) {
  11. return node.color === 'red'
  12. }
  13. function flipColors(node) {
  14. node.color = 'red'
  15. node.left.color = 'black'
  16. node.right.color = 'black'
  17. return node
  18. }
  19. // 红黑树插入
  20. function redBlackInsert(node, value) {
  21. if(value > node.value) node.right = redBlackInsert(node.right,value);
  22. else if(value < node.value) node.left = redBlackInsert(node,value)
  23. if(isRed(node.right) && !isRed(node.left)) node = rotate(node,"left");
  24. if(isRed(node.left) && isRed(node.left.left)) node = rotate(node,"right");
  25. if(isRed(node.right) && isRed(node.left)) node = flipColors(node);
  26. return node
  27. }