Javascript实现二叉树算法

浅浅的花香味﹌ 2023-06-06 12:07 65阅读 0赞

目录

二叉树算法原理及代码实现

二叉树定义

中序遍历

前序遍历

后序遍历

二叉树节点查找

二叉树叶子节点的删除原理及实现


二叉树算法原理及代码实现

二叉树定义

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dvXzkyMTExMA_size_16_color_FFFFFF_t_70

8:二叉树的根节点

4、7、13:二叉树的叶子节点

其他:中间节点

排序二叉树:

特点:节点的左子节点小于当前节点,节点的右子节点大于当前节点

代码实现:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>binaryTree</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function BinaryTree() {
  9. var Node = function(key) {
  10. this.key = key;
  11. this.left = null;
  12. this.right = null;
  13. }
  14. var root = null;
  15. var insertNode = function (node, newNode) {
  16. if(newNode.key < node.key) {
  17. if(node.left === null) {
  18. node.left = newNode;
  19. } else {
  20. insertNode(node.left,newNode);
  21. }
  22. } else {
  23. if(node.right === null) {
  24. node.right = newNode;
  25. } else {
  26. insertNode(node.right, newNode)
  27. }
  28. }
  29. }
  30. this.insert = function (key) {
  31. var NewNode = new Node(key)
  32. if(root === null) {
  33. root = NewNode
  34. } else {
  35. insertNode(root, NewNode);
  36. }
  37. }
  38. }
  39. var nodes = [8,3,10,1,6,14,4,7,13];
  40. var binaryTree = new BinaryTree();
  41. nodes.forEach(function(key){
  42. binaryTree.insert(key)
  43. })
  44. </script>
  45. </body>
  46. </html>

中序遍历

原理:判断当前节点是否有左子节点,有的话,先遍历整个的左子树,再输出当前节点,最后遍历整个右子树

代码实现:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>binaryTree</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function BinaryTree() {
  9. var Node = function(key) {
  10. this.key = key;
  11. this.left = null;
  12. this.right = null;
  13. }
  14. var root = null;
  15. var insertNode = function (node, newNode) {
  16. if(newNode.key < node.key) {
  17. if(node.left === null) {
  18. node.left = newNode;
  19. } else {
  20. insertNode(node.left,newNode);
  21. }
  22. } else {
  23. if(node.right === null) {
  24. node.right = newNode;
  25. } else {
  26. insertNode(node.right, newNode)
  27. }
  28. }
  29. }
  30. this.insert = function (key) {
  31. var NewNode = new Node(key)
  32. if(root === null) {
  33. root = NewNode
  34. } else {
  35. insertNode(root, NewNode);
  36. }
  37. };
  38. var inOrderTraverseNode = function (node,callback) {
  39. if(node !== null) {
  40. inOrderTraverseNode(node.left,callback);
  41. callback(node.key);
  42. inOrderTraverseNode(node.right,callback)
  43. }
  44. }
  45. this.inOrderTraverse = function(callback) {
  46. inOrderTraverseNode(root,callback);
  47. }
  48. }
  49. var nodes = [8,3,10,1,6,14,4,7,13];
  50. var binaryTree = new BinaryTree();
  51. nodes.forEach(function(key){
  52. binaryTree.insert(key);
  53. })
  54. var callback = function (key) {
  55. console.log(key);
  56. }
  57. binaryTree.inOrderTraverse(callback);
  58. </script>
  59. </body>
  60. </html>

注意打断点可以看到执行过程

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dvXzkyMTExMA_size_16_color_FFFFFF_t_70 1

执行结果:

20191118114911861.png

前序遍历

原理:先打印当前节点,然后找到当前节点的左子树,然后再打印当前节点的左子树,然后找到左子树的左子树,最后打印右子树(可以复制当前的二叉树,效率更高)

代码实现:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>binaryTree</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function BinaryTree() {
  9. var Node = function(key) {
  10. this.key = key;
  11. this.left = null;
  12. this.right = null;
  13. }
  14. var root = null;
  15. var insertNode = function (node, newNode) {
  16. if(newNode.key < node.key) {
  17. if(node.left === null) {
  18. node.left = newNode;
  19. } else {
  20. insertNode(node.left,newNode);
  21. }
  22. } else {
  23. if(node.right === null) {
  24. node.right = newNode;
  25. } else {
  26. insertNode(node.right, newNode)
  27. }
  28. }
  29. }
  30. this.insert = function (key) {
  31. var NewNode = new Node(key)
  32. if(root === null) {
  33. root = NewNode
  34. } else {
  35. insertNode(root, NewNode);
  36. }
  37. };
  38. var preOrderTraverseNode = function (node,callback) {
  39. if(node !== null) {
  40. callback(node.key);
  41. preOrderTraverseNode(node.left,callback);
  42. preOrderTraverseNode(node.right,callback)
  43. }
  44. }
  45. this.preOrderTraverse = function (callback) {
  46. preOrderTraverseNode(root, callback)
  47. }
  48. }
  49. var nodes = [8,3,10,1,6,14,4,7,13];
  50. var binaryTree = new BinaryTree();
  51. nodes.forEach(function(key){
  52. binaryTree.insert(key);
  53. })
  54. var callback = function (key) {
  55. console.log(key);
  56. }
  57. binaryTree.preOrderTraverse(callback);
  58. </script>
  59. </body>
  60. </html>

后序遍历

原理:判断当前节点是否有左子节点,有的话,先遍历整个的左子树,再遍历整个右子树,最后输出当前节点(用于操作系统和文件系统中)

代码实现:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>binaryTree</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function BinaryTree() {
  9. var Node = function(key) {
  10. this.key = key;
  11. this.left = null;
  12. this.right = null;
  13. }
  14. var root = null;
  15. var insertNode = function (node, newNode) {
  16. if(newNode.key < node.key) {
  17. if(node.left === null) {
  18. node.left = newNode;
  19. } else {
  20. insertNode(node.left,newNode);
  21. }
  22. } else {
  23. if(node.right === null) {
  24. node.right = newNode;
  25. } else {
  26. insertNode(node.right, newNode)
  27. }
  28. }
  29. }
  30. this.insert = function (key) {
  31. var NewNode = new Node(key)
  32. if(root === null) {
  33. root = NewNode
  34. } else {
  35. insertNode(root, NewNode);
  36. }
  37. };
  38. var postOrderTraverseNode = function (node,callback) {
  39. if(node !== null) {
  40. postOrderTraverseNode(node.left,callback);
  41. postOrderTraverseNode(node.right,callback);
  42. callback(node.key);
  43. }
  44. }
  45. this.postOrderTraverse = function (callback) {
  46. postOrderTraverseNode(root, callback)
  47. }
  48. }
  49. var nodes = [8,3,10,1,6,14,4,7,13];
  50. var binaryTree = new BinaryTree();
  51. nodes.forEach(function(key){
  52. binaryTree.insert(key);
  53. })
  54. var callback = function (key) {
  55. console.log(key);
  56. }
  57. binaryTree.postOrderTraverse(callback);
  58. </script>
  59. </body>
  60. </html>

二叉树节点查找

二叉树的节点查找分为三种:

  1. 查找二叉树节点的最小值
  2. 查找二叉树节点的最大值
  3. 给定一个值,判断二叉树节点中是否存在

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dvXzkyMTExMA_size_16_color_FFFFFF_t_70

查找二叉树节点的最小值

先判断当前节点是否有左孩子,然后进入节点3,判断现在的节点3是否有左孩子,然后有进入节点1,判断节点1是否有左孩子,没有,所有二叉树节点的最小值是节点1

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>binaryTree</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function BinaryTree() {
  9. var Node = function(key) {
  10. this.key = key;
  11. this.left = null;
  12. this.right = null;
  13. }
  14. var root = null;
  15. var insertNode = function (node, newNode) {
  16. if(newNode.key < node.key) {
  17. if(node.left === null) {
  18. node.left = newNode;
  19. } else {
  20. insertNode(node.left,newNode);
  21. }
  22. } else {
  23. if(node.right === null) {
  24. node.right = newNode;
  25. } else {
  26. insertNode(node.right, newNode)
  27. }
  28. }
  29. }
  30. this.insert = function (key) {
  31. var NewNode = new Node(key)
  32. if(root === null) {
  33. root = NewNode
  34. } else {
  35. insertNode(root, NewNode);
  36. }
  37. };
  38. var minNode = function (node) {
  39. if (node) {
  40. while (node && node.left !== null) {
  41. node = node.left;
  42. }
  43. return node.key
  44. }
  45. return null;
  46. }
  47. this.min = function () {
  48. return minNode(root)
  49. }
  50. }
  51. var nodes = [8,3,10,1,6,14,4,7,13];
  52. var binaryTree = new BinaryTree();
  53. nodes.forEach(function(key){
  54. binaryTree.insert(key);
  55. })
  56. var callback = function (key) {
  57. console.log(key);
  58. }
  59. console.log('min node is:' + binaryTree.min());
  60. </script>
  61. </body>
  62. </html>

查找二叉树节点的最大值

先判断当前节点是否有右孩子,然后进入节点10,判断现在的节点10是否有右孩子,然后有进入节点14,判断节点14是否有右孩子,没有,所有二叉树节点的最大值是节点14

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>binaryTree</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function BinaryTree() {
  9. var Node = function(key) {
  10. this.key = key;
  11. this.left = null;
  12. this.right = null;
  13. }
  14. var root = null;
  15. var insertNode = function (node, newNode) {
  16. if(newNode.key < node.key) {
  17. if(node.left === null) {
  18. node.left = newNode;
  19. } else {
  20. insertNode(node.left,newNode);
  21. }
  22. } else {
  23. if(node.right === null) {
  24. node.right = newNode;
  25. } else {
  26. insertNode(node.right, newNode)
  27. }
  28. }
  29. }
  30. this.insert = function (key) {
  31. var NewNode = new Node(key)
  32. if(root === null) {
  33. root = NewNode
  34. } else {
  35. insertNode(root, NewNode);
  36. }
  37. };
  38. var maxNode = function (node) {
  39. if (node) {
  40. while (node && node.right !== null) {
  41. node = node.right;
  42. }
  43. return node.key
  44. }
  45. return null;
  46. }
  47. this.max = function () {
  48. return maxNode(root)
  49. }
  50. }
  51. var nodes = [8,3,10,1,6,14,4,7,13];
  52. var binaryTree = new BinaryTree();
  53. nodes.forEach(function(key){
  54. binaryTree.insert(key);
  55. })
  56. var callback = function (key) {
  57. console.log(key);
  58. }
  59. console.log('max node is:' + binaryTree.max());
  60. </script>
  61. </body>
  62. </html>

给定一个值,判断二叉树节点中是否存在

假如给定的值是7,然后先判断与当前节点8的大小,比当前节点小就进入当前节点的左子树,进入节点3,判断节点3大小,然后进入节点3的右子树,进入节点6,判断节点6大小,然后进入节点6的右子树

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>binaryTree</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function BinaryTree() {
  9. var Node = function(key) {
  10. this.key = key;
  11. this.left = null;
  12. this.right = null;
  13. }
  14. var root = null;
  15. var insertNode = function (node, newNode) {
  16. if(newNode.key < node.key) {
  17. if(node.left === null) {
  18. node.left = newNode;
  19. } else {
  20. insertNode(node.left,newNode);
  21. }
  22. } else {
  23. if(node.right === null) {
  24. node.right = newNode;
  25. } else {
  26. insertNode(node.right, newNode)
  27. }
  28. }
  29. }
  30. this.insert = function (key) {
  31. var NewNode = new Node(key)
  32. if(root === null) {
  33. root = NewNode
  34. } else {
  35. insertNode(root, NewNode);
  36. }
  37. };
  38. var searchNode = function (node,key) {
  39. if (node === null) {
  40. return false
  41. }
  42. if( key < node.key) {
  43. return searchNode(node.left, key)
  44. } else if(key > node.key) {
  45. return searchNode(node.right, key)
  46. } else {
  47. return true
  48. }
  49. }
  50. this.search = function (key) {
  51. return searchNode(root, key)
  52. }
  53. }
  54. var nodes = [8,3,10,1,6,14,4,7,13];
  55. var binaryTree = new BinaryTree();
  56. nodes.forEach(function(key){
  57. binaryTree.insert(key);
  58. })
  59. var callback = function (key) {
  60. console.log(key);
  61. }
  62. console.log(binaryTree.search(7) ? 'key 7 is found' : 'key 7 is not found');
  63. console.log(binaryTree.search(9) ? 'key 9 is found' : 'key 9 is not found');
  64. </script>
  65. </body>
  66. </html>

二叉树叶子节点的删除原理及实现

二叉树节点的删除也是可以分为几种情况:

  • 被删除节点为叶子节点;
  • 被删除节点仅有一个子节点(子树);
  • 被删除节点有两个子节点(子树)

被删除节点为叶子节点

思路:将该叶子节点的父节点指向的子节点的引用值设为空

被删除节点仅有一个子树

思路:将该节点的父节点指向该节点的引用改成指向该节点的子节点。

被删除节点有两个子树

思路:处理这种情况有两种方法:

  • 从待删除节点的左子树找节点值最大的节点A,替换待删除节点,并删除节点A;
  • 从待删除节点的右子树找节点值最小的节点A,替换待删除节点,并删除节点A。

PS:我们这里选择第二种方法。
以下图的二叉树为例,删除节点3。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>binaryTree</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function BinaryTree() {
  9. var Node = function(key) {
  10. this.key = key;
  11. this.left = null;
  12. this.right = null;
  13. }
  14. var root = null;
  15. var insertNode = function (node, newNode) {
  16. if(newNode.key < node.key) {
  17. if(node.left === null) {
  18. node.left = newNode;
  19. } else {
  20. insertNode(node.left,newNode);
  21. }
  22. } else {
  23. if(node.right === null) {
  24. node.right = newNode;
  25. } else {
  26. insertNode(node.right, newNode)
  27. }
  28. }
  29. }
  30. this.insert = function (key) {
  31. var NewNode = new Node(key)
  32. if(root === null) {
  33. root = NewNode
  34. } else {
  35. insertNode(root, NewNode);
  36. }
  37. };
  38. var findMinNode = function(node) {
  39. if(node) {
  40. while (node && node.left !== null) {
  41. node = node.left;
  42. }
  43. return node
  44. }
  45. }
  46. var removeNode = function (node,key) {
  47. if (node === null) {
  48. return false
  49. }
  50. if( key < node.key) {
  51. node.left = removeNode(node.left, key)
  52. return node
  53. } else if(key > node.key) {
  54. node.right = removeNode(node.right, key)
  55. return node
  56. } else {
  57. // 没有子节点(子树)
  58. if(node.left === null && node.right === null) {
  59. node = null;
  60. return node
  61. }
  62. // 只有右子节点(子树)
  63. if(node.left === null) {
  64. node = node.right;
  65. return node;
  66. // 只有左子节点(子树)
  67. } else if (node.right === null) {
  68. node = node.left;
  69. return node;
  70. }
  71. // 有两个子节点(子树)
  72. var aux = findMinNode(node.right);
  73. node.key = aux.key;
  74. node.right = removeNode(node.right, aux.key);
  75. return node;
  76. }
  77. }
  78. this.remove = function (key) {
  79. return removeNode(root, key)
  80. }
  81. }
  82. var nodes = [8,3,10,1,6,14,4,7,13];
  83. var binaryTree = new BinaryTree();
  84. nodes.forEach(function(key){
  85. binaryTree.insert(key);
  86. })
  87. var callback = function (key) {
  88. console.log(key);
  89. }
  90. binaryTree.remove(3)
  91. </script>
  92. </body>
  93. </html>

gitHub地址:排序二叉树的代码实现

发表评论

表情:
评论列表 (有 0 条评论,65人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法

    二叉树的种类 一个根节点下面只有两个子节点,称为二叉树 满二叉树 每一层的结点数都达到最大值,则这个二叉树就是满二叉树。 也就是说,如果一个二叉树的层数为K(

    相关 算法

    二叉树是一种常用的数据结构。它有以下几个重要的性质: 1. 每个节点最多有两个子节点。 2. 左子节点和右子节点的值都要小于父节点的值。 二叉树的一些常用算法包括:

    相关 iOS 相关算法实现

    什么是二叉树? 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”,左子树和右子树同时也是二叉树。二叉树的子树有左右之分,并且次