一、题目内容 简单

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

示例1:

输入:root = [4,2,6,1,3] 输出:1 16. 二叉搜索树的最小绝对差(530) - 图1

示例2:

输入:root = [1,0,48,null,null,12,49] 输出:1 16. 二叉搜索树的最小绝对差(530) - 图2

提示:

  • 树中节点的数目范围是 [2, 104]
  • 0 <= Node.val <= 105

    二、解题思路

    二叉搜索树实际上是有序的,那么相当于我们在有序数组中找出最小绝对差。
    只需要把相邻元素相减,找出其中最小绝对差就好了。
    那么我们第一步就应该是把二叉搜索树转成有序数组。

    二叉搜索树适合中序遍历。

三、具体代码

  1. /**
  2. * @param {TreeNode} root
  3. * @return {number}
  4. */
  5. var getMinimumDifference = function (root) {
  6. const nums = []
  7. const traversal = (node) => {
  8. if (!node) return
  9. traversal(node.left)
  10. nums.push(node.val)
  11. traversal(node.right)
  12. }
  13. traversal(root)
  14. let result = Infinity
  15. for (let i = 1, len = nums.length; i < len; i++) {
  16. result = Math.min(Math.abs(nums[i] - nums[i - 1]), result)
  17. }
  18. return result
  19. };

四、其他解法

迭代法

  1. /**
  2. * @param {TreeNode} root
  3. * @return {number}
  4. */
  5. var getMinimumDifference = function (root) {
  6. const stack = []
  7. let result = Infinity
  8. let pre = null, cur = root
  9. while (cur || stack.length) {
  10. if (cur) {
  11. stack.push(cur)
  12. cur = cur.left
  13. } else {
  14. cur = stack.pop()
  15. if (pre) {
  16. result = Math.min(Math.abs(cur.val - pre.val), result)
  17. }
  18. pre = cur
  19. cur = cur.right
  20. }
  21. }
  22. return result
  23. };