Skip to content

Commit

Permalink
530. Minimum Absolute Difference in BST
Browse files Browse the repository at this point in the history
  • Loading branch information
dobermanch committed Dec 24, 2023
1 parent 133d943 commit a40f691
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 0 deletions.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1046,6 +1046,11 @@ Code: [`C#`](/src/csharp/Problems/FindSubsequences.cs)
Tags: `Math` `Dynamic Programming` `Recursion` `Memoization`
Code: [`C#`](/src/csharp/Problems/Fibonacci.cs)

### [530. Minimum Absolute Difference in BST](https://leetcode.com/problems/minimum-absolute-difference-in-bst)

Tags: `Tree` `Depth-First Search` `Breadth-First Search` `Binary Search Tree` `Binary Tree`
Code: [`C#`](/src/csharp/Problems/GetMinimumDifference.cs) [`Go`](/src/go/problems/get_minimum_difference_test.go) [`Python`](/src/python/problems/get_minimum_difference_test.py)

### [542. 01 Matrix](https://leetcode.com/problems/01-matrix/)

Tags: `Array` `Dynamic Programming` `Breadth-First Search` `Matrix`
Expand Down
46 changes: 46 additions & 0 deletions src/csharp/Problems/GetMinimumDifference.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//https://leetcode.com/problems/binary-tree-inorder-traversal/

namespace LeetCode.Problems;

public sealed class GetMinimumDifference : ProblemBase
{
[Theory]
[ClassData(typeof(GetMinimumDifference))]
public override void Test(object[] data) => base.Test(data);

protected override void AddTestCases()
=> Add(it => it.ParamTree("[4,2,6,1,3]").Result(1))
.Add(it => it.ParamTree("[1,0,48,null,null,12,49]").Result(1))
.Add(it => it.ParamTree("[10,0,48,null,null,16,56]").Result(6));

private int Solution(TreeNode? root)
{
var stack = new Stack<TreeNode>();
TreeNode? prevNode = null;
var diff = int.MaxValue;

var node = root;
while (node != null || stack.Any())
{
if (node != null)
{
stack.Push(node);
node = node.left;
}
else
{
var pop = stack.Pop();
if (prevNode != null)
{
diff = Math.Min(diff, pop.val - prevNode.val);
}

prevNode = pop;

node = pop.right;
}
}

return diff;
}
}
53 changes: 53 additions & 0 deletions src/go/problems/get_minimum_difference_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// https://leetcode.com/problems/minimum-absolute-difference-in-bst

package problems

import (
"math"
"testing"

"github.com/dobermanch/leetcode/core"
)

type GetMinimumDifference struct{}

func TestGetMinimumDifference(t *testing.T) {
gen := core.TestSuite[GetMinimumDifference]{}
gen.Add(func(tc *core.TestCase) {
root := &TreeNode{
Val: 10,
Left: &TreeNode{Val: 0, Left: &TreeNode{Val: 4}},
Right: &TreeNode{Val: 48, Left: &TreeNode{Val: 16}, Right: &TreeNode{Val: 56}},
}
tc.Param(root).Result(6)
}).Run(t)
}

func (GetMinimumDifference) Solution(root *TreeNode) int {
stack := []*TreeNode{}
diff := math.MaxInt

node := root
var prevNode *TreeNode
for node != nil || len(stack) > 0 {
if node != nil {
stack = append(stack, node)
node = node.Left
} else {
pop := stack[len(stack)-1]
stack = stack[:len(stack)-1]

if prevNode != nil {
newDiff := pop.Val - prevNode.Val
if newDiff < diff {
diff = newDiff
}
}

prevNode = pop
node = pop.Right
}
}

return diff
}
34 changes: 34 additions & 0 deletions src/python/problems/get_minimum_difference_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# https://leetcode.com/problems/minimum-absolute-difference-in-bst

from typing import Optional
from core.problem_base import *
from models.tree_node import TreeNode

class GetMinimumDifference(ProblemBase):
def Solution(self, root: Optional[TreeNode]) -> int:
stack = []
diff = 10**5

node = root
prevNode = None
while node or len(stack) > 0:
if node:
stack.append(node)
node = node.left
else:
pop = stack.pop()

if prevNode:
diff = min(diff, pop.val - prevNode.val)

prevNode = pop
node = pop.right

return diff

if __name__ == '__main__':
TestGen(GetMinimumDifference) \
.Add(lambda tc: tc.ParamTreeNode([4,2,6,1,3]).Result(1)) \
.Add(lambda tc: tc.ParamTreeNode([1,0,48,None,None,12,49]).Result(1)) \
.Add(lambda tc: tc.ParamTreeNode([10,0,48,None,None,16,56]).Result(6)) \
.Run()

0 comments on commit a40f691

Please sign in to comment.