Skip to content

Commit

Permalink
Merge 1356454 into 5c70e64
Browse files Browse the repository at this point in the history
  • Loading branch information
vaskoz committed Feb 19, 2020
2 parents 5c70e64 + 1356454 commit 6327ecb
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -450,4 +450,5 @@ problems from
* [Day 450](https://github.com/vaskoz/dailycodingproblem-go/issues/909)
* [Day 451](https://github.com/vaskoz/dailycodingproblem-go/issues/911)
* [Day 452](https://github.com/vaskoz/dailycodingproblem-go/issues/913)
* [Day 453](https://github.com/vaskoz/dailycodingproblem-go/issues/915)

46 changes: 46 additions & 0 deletions day453/problem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package day453

// BST is an integer binary search tree.
type BST struct {
Val int
Left, Right *BST
}

// FindTwoSumKInBST returns a slice of integer nodes that sum to K.
// If no two nodes exist that sum to K, then return nil.
// Runs in O(N log N) where N is the size of the BST.
func FindTwoSumKInBST(head *BST, k int) []int {
return inorder(head, head, k, []int{})
}

func inorder(head, current *BST, k int, result []int) []int {
if current == nil {
return result
}

if leftResult := inorder(head, current.Left, k, result); len(leftResult) == 2 {
return leftResult
}

if node := searchBST(head, k-current.Val); node != nil && node != current {
return []int{current.Val, node.Val}
}

if rightResult := inorder(head, current.Right, k, result); len(rightResult) == 2 {
return rightResult
}

return result
}

func searchBST(head *BST, target int) *BST {
if head == nil {
return nil
}

if target == head.Val {
return head
}

return searchBST(head.Right, target)
}
44 changes: 44 additions & 0 deletions day453/problem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package day453

import (
"reflect"
"testing"
)

// nolint
var testcases = []struct {
head *BST
k int
expected []int
}{
{&BST{10, &BST{5, nil, nil}, &BST{
15, &BST{11, nil, nil}, &BST{15, nil, nil},
}}, 20, []int{5, 15}},
{&BST{10, &BST{5, nil, nil}, &BST{
15, &BST{11, nil, nil}, &BST{15, nil, nil},
}}, 100, []int{}},
{&BST{10, &BST{5, nil, nil}, &BST{
15, &BST{11, nil, nil}, &BST{15, nil, nil},
}}, 15, []int{5, 10}},
{&BST{10, &BST{5, nil, nil}, &BST{
15, &BST{11, nil, nil}, &BST{15, nil, nil},
}}, 26, []int{11, 15}},
}

func TestFindTwoSumKInBST(t *testing.T) {
t.Parallel()

for _, tc := range testcases {
if result := FindTwoSumKInBST(tc.head, tc.k); !reflect.DeepEqual(result, tc.expected) {
t.Errorf("Expected %v got %v", tc.expected, result)
}
}
}

func BenchmarkFindTwoSumInBST(b *testing.B) {
for i := 0; i < b.N; i++ {
for _, tc := range testcases {
FindTwoSumKInBST(tc.head, tc.k)
}
}
}

0 comments on commit 6327ecb

Please sign in to comment.