1. function Node(value) {
    2. this.value = value;
    3. this.left = null;
    4. this.right = null;
    5. }
    6. var a1 = new Node('a');
    7. var b1 = new Node('b');
    8. var c1 = new Node('c');
    9. var d1 = new Node('d');
    10. var e1 = new Node('e');
    11. var f1 = new Node('f');
    12. var g1 = new Node('g');
    13. var h1 = new Node('h');
    14. var i1 = new Node('i');
    15. var j1 = new Node('j');
    16. var k1 = new Node('k');
    17. a1.left = b1;
    18. a1.right = c1;
    19. b1.left = d1;
    20. b1.right = e1;
    21. c1.left = f1;
    22. c1.right = g1;
    23. d1.left = h1;
    24. d1.right = i1;
    25. g1.left = j1;
    26. g1.right = k1;
    27. var a2 = new Node('a');
    28. var b2 = new Node('b');
    29. var c2 = new Node('c');
    30. var d2 = new Node('d');
    31. var e2 = new Node('e');
    32. var f2 = new Node('f');
    33. var g2 = new Node('g');
    34. var h2 = new Node('h');
    35. var i2 = new Node('i');
    36. var j2 = new Node('j');
    37. var k2 = new Node('k');
    38. a2.left = b2;
    39. a2.right = c2;
    40. b2.left = d2;
    41. b2.right = e2;
    42. c2.left = f2;
    43. c2.right = g2;
    44. // d2.left = h2; 修改 h 为 hh
    45. d2.left = 'hh';
    46. d2.right = i2;
    47. g2.left = j2;
    48. // g2.right = k2; 删除 k
    49. // 新增了什么,修改了什么,删除了什么
    50. // {type: "新增", origin: null, now: a1}
    51. // {type: "修改", origin: a1, now: a2}
    52. // {type: "删除", origin: a2, now: null}
    53. function diffTree(root1, root2, diffList) {
    54. if (root1 == root2) return diffList;
    55. if (root1 == null && root2 != null) {
    56. // 新增节点
    57. diffList.push({ type: '新增', origin: null, now: root2 });
    58. } else if (root1 != null && root2 == null) {
    59. // 删除节点
    60. diffList.push({ type: '删除', origin: root1, now: null });
    61. } else if (root1.value != root2.value) {
    62. // 相同位置的节点值不同, 修改了节点
    63. diffList.push({ type: '修改', origin: root1, now: root2 });
    64. // 在修改节点后继续比较, 因为如果修改的节点后还有修改的节点所有需要继续比较
    65. diffTree(root1.left, root2.left, diffList);
    66. diffTree(root1.right, root2.right, diffList);
    67. } else {
    68. // 如果都不满足条件就继续比较下一个节点
    69. diffTree(root1.left, root2.left, diffList);
    70. diffTree(root1.right, root2.right, diffList);
    71. }
    72. }
    73. var diffList = [];
    74. diffTree(a1, a2, diffList);
    75. console.log(diffList);

    image.png