二叉树:
    每个节点最多有2个子节点

    二叉搜索树(BST):二叉树的一种
    左子树中所有的节点都比跟节点小,右子树所有的节点都比跟节点大

    下图:展现了一棵二叉搜索树
    image.png

    算法:
    image.png

    二叉树的实现

    1. class BST{
    2. constructor() {
    3. this.root = null;
    4. }
    5. // 插入
    6. insert(key, value) {
    7. // 如果有根
    8. if(!this.root) {
    9. this.root = new BSTNode(key, value);
    10. } else {
    11. insert(this.root);
    12. }
    13. function insert(node){
    14. if(node.key === key) {
    15. throw new Error ('不能重复')
    16. } else {
    17. // 往右走
    18. if(node.key < key) {
    19. if(!node.right) {
    20. node.right = new BSTNode(key, value);
    21. } else {
    22. // 继续比较
    23. insert(node.right);
    24. }
    25. } else {
    26. // 往左走
    27. if(!node.left) {
    28. node.left = new BSTNode(key, value);
    29. } else {
    30. // 继续比较
    31. insert(node.left);
    32. }
    33. }
    34. }
    35. }
    36. }
    37. // 查询
    38. search(key) {
    39. if(!this.root) {
    40. return undefined;
    41. } else {
    42. return search(this.root);
    43. }
    44. function search(node) {
    45. // 如果node是空节点
    46. if(!node) return undefined;
    47. if(node.key === key) {
    48. return node.value;
    49. } else {
    50. if(node.key < key) {
    51. // 往右查询
    52. return search(node.right);
    53. } else {
    54. // 往左查询
    55. return search(node.left);
    56. }
    57. }
    58. // 最终没找到返回
    59. return undefined;
    60. }
    61. }
    62. }
    63. class BSTNode {
    64. constructor(key, value) {
    65. this.key = key;
    66. this.value = value;
    67. this.left = null;
    68. this.right = null;
    69. }
    70. }
    71. const tree = new BST();
    72. tree.insert(16, 'aa');
    73. tree.insert(2, 'bb');
    74. tree.insert(20, 'cc');
    75. tree.insert(13, 'dd');
    76. tree.insert(8, 'ee');
    77. tree.insert(4, 'ff');
    78. tree.insert(25, 'gg');
    79. console.log(tree.search(20));
    80. console.log(tree);

    二叉树 - 遍历

    树 - 遍历
    1.把所有数据都走一遍
    2.数据持久化

    1. 树遍历<br /> 深度优先、广度优先
    2. 二叉树树遍历<br /> 前序:当前节点 left, right<br /> 中序:left, 当前节点, right<br /> 后序: left , right , 当前节点
    3. 二叉排序<br /> 1.把数据随机插入<br /> 2.按照“中序遍历“的顺序,把数据重新遍历出来
    1. class BST{
    2. constructor() {
    3. this.root = null;
    4. }
    5. // 插入
    6. insert(key, value) {
    7. // 如果有根
    8. if(!this.root) {
    9. this.root = new BSTNode(key, value);
    10. } else {
    11. insert(this.root);
    12. }
    13. function insert(node){
    14. if(node.key === key) {
    15. throw new Error ('不能重复')
    16. } else {
    17. // 往右走
    18. if(node.key < key) {
    19. if(!node.right) {
    20. node.right = new BSTNode(key, value);
    21. } else {
    22. // 继续比较
    23. insert(node.right);
    24. }
    25. } else {
    26. // 往左走
    27. if(!node.left) {
    28. node.left = new BSTNode(key, value);
    29. } else {
    30. // 继续比较
    31. insert(node.left);
    32. }
    33. }
    34. }
    35. }
    36. }
    37. // 查询
    38. search(key) {
    39. if(!this.root) {
    40. return undefined;
    41. } else {
    42. return search(this.root);
    43. }
    44. function search(node) {
    45. // 如果node是空节点
    46. if(!node) return undefined;
    47. if(node.key === key) {
    48. return node.value;
    49. } else {
    50. if(node.key < key) {
    51. // 往右查询
    52. return search(node.right);
    53. } else {
    54. // 往左查询
    55. return search(node.left);
    56. }
    57. }
    58. // 最终没找到返回
    59. return undefined;
    60. }
    61. }
    62. // 中序遍历 left, 当前节点, right,遍历后数据
    63. walk(fn){
    64. if(!this.root) {
    65. return;
    66. } else {
    67. return walk(this.root);
    68. }
    69. function walk(node) {
    70. if(!node) return;
    71. else {
    72. walk(node.left);
    73. fn(node);
    74. walk(node.right)
    75. }
    76. }
    77. }
    78. }
    79. class BSTNode {
    80. constructor(key, value) {
    81. this.key = key;
    82. this.value = value;
    83. this.left = null;
    84. this.right = null;
    85. }
    86. }
    87. const tree = new BST();
    88. // 随机插入
    89. tree.insert(16, 'aa');
    90. tree.insert(2, 'bb');
    91. tree.insert(20, 'cc');
    92. tree.insert(13, 'dd');
    93. tree.insert(8, 'ee');
    94. tree.insert(4, 'ff');
    95. tree.insert(25, 'gg');
    96. tree.insert(3, 'hh');
    97. tree.insert(45, 'hh');
    98. tree.insert(23, 'hh');
    99. tree.insert(18, 'hh');
    100. console.log(tree);
    101. // 遍历
    102. tree.walk(node => console.log(node.key, node.value));