ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

0530-二叉搜索树的最小绝对差

2021-11-18 23:35:26  阅读:113  来源: 互联网

标签:0530 node TreeNode cur res 二叉 搜索 result root


给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入:root = [4,2,6,1,3]
输出:1
示例 2:

输入:root = [1,0,48,null,null,12,49]
输出:1

提示:

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

注意:本题与 783 https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/ 相同

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst

参考:

python

# 0530.二叉搜索树的最小绝对差

# 递归-中序-数组比较
class Solution:
    def getMinimumDifference(self, root: *TreeNode) -> int:
        res = []
        r = float("inf")

        def buildaList(root):  # 把二叉搜索树转换成有序数组
            if not root: return None
            if root.left: buildaList(root.left)  # 左
            res.append(root.val)  # 中
            if root.right: buildaList(root.right)  # 右
            return res

        buildaList(root)
        for i in range(len(res) - 1):  # 统计有序数组的最小差值
            r = min(abs(res[i] - res[i + 1]), r)
        return r


class Solution1:
    def getMinimumDifference(self, root: *TreeNode) -> int:
        result = 1<<63-1
        pre = None

        def travel(node):
            nonlocal result, pre
            if not node:
                return

            travel(node.left)

            if pre != None:
                result = min(result, node.val-pre.val)
            pre = node # 记录前一个

            travel(node.right)

        travel(root)
        return result

class Solution2:
    def getMinimumDifference(self, root: TreeNode) -> int:
        stack = []
        cur = root
        pre = None
        result = 1<<63-1

        while cur or stack:
            if cur: # 遍历至最左左节点
                stack.append(cur)
                cur = cur.left
            else: # 处理栈顶元素
                cur = stack.pop()
                if pre:
                    result = min(result, cur.val-pre.val)
                pre = cur
                cur = cur.right

        return result

golang

package binaryTree

import "math"

// 递归-中序-数组比较
func getMinimumDifference1(root *TreeNode) int {
	res := []int{}

	var travel func(node *TreeNode)
	travel = func(node *TreeNode) {
		if node == nil {
			return
		}
		travel(node.Left)
		res = append(res, node.Val)
		travel(node.Right)
	}

	travel(root)
	if len(res) < 2 {
		return 0
	}
	Min := math.MaxInt64
	for i:=1;i<len(res);i++ {
		temp := res[i] - res[i-1]
		if Min > temp {
			Min = temp
		}
	}
	return Min
}

// 递归-中序前驱节点-利用BST的性质
func getMinimumDifference2(root *TreeNode) int {
	result := math.MaxInt64
	var pre *TreeNode

	var travel func(node *TreeNode)
	travel = func(node *TreeNode) {
		if node == nil {
			return
		}
		travel(node.Left)
		if pre != nil {
			temp := node.Val - pre.Val
			if result > temp {
				result = temp
			}
		}
		pre = node
		travel(node.Right)
	}

	travel(root)
	return result
}

// 迭代-中序遍历-有限变量处理
func getMinimumDifference3(root *TreeNode) int {
	stack := []*TreeNode{}
	cur := root
	var pre *TreeNode
	result := math.MaxInt64

	for cur != nil || len(stack) > 0 {
		if cur != nil {
			stack = append(stack, cur)
			cur = cur.Left
		} else {
			cur = stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			if pre != nil {
				temp := cur.Val - pre.Val
				if result > temp {
					result = temp
				}
			}
			pre = cur
			cur = cur.Right
		}
	}
	return result
}


标签:0530,node,TreeNode,cur,res,二叉,搜索,result,root
来源: https://www.cnblogs.com/davis12/p/15575091.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有