来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。

解答

比较傻的方法是所有的数据用数组记录下来,每个节点遍历都计算下最小值,这个方法性能较差

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @return {number}
  12. */
  13. var minDiffInBST = function(root) {
  14. let min = Infinity;
  15. function traverse (node, values) {
  16. if (!node) return;
  17. const val = node.val;
  18. for (let value of values) {
  19. let temp = Math.abs(value - val);
  20. if (temp < min) {
  21. min = temp;
  22. }
  23. }
  24. values.push(val);
  25. node.left && traverse(node.left, values);
  26. node.right && traverse(node.right, values);
  27. }
  28. traverse(root, []);
  29. return min;
  30. };

更高性能解决方案

因为二叉搜索树,使用中序遍历,会产出一个升序数组
那么中序遍历时,只要获取每个节点跟前一个节点的差值,比较最小值即可

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @return {number}
  12. */
  13. var minDiffInBST = function(root) {
  14. let min = Number.MAX_SAFE_INTEGER, pre = -1;
  15. function traverse (node) {
  16. if (!node) return;
  17. traverse(node.left);
  18. if (pre === -1) {
  19. pre = node.val;
  20. } else {
  21. min = Math.min(min, node.val - pre);
  22. pre = node.val;
  23. }
  24. traverse(node.right);
  25. }
  26. traverse(root);
  27. return min;
  28. };