Skip to content

Commit 1da2bda

Browse files
committed
Kth smallest element in a BST
1 parent 061f5e1 commit 1da2bda

File tree

2 files changed

+240
-0
lines changed

2 files changed

+240
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// 230. Kth smallest element in a BST
2+
// Topics: 'Tree', 'Binary Search Tree', 'Binary Tree', 'Depth-First Search'
3+
// Level: 'Medium'
4+
5+
// Given the root of a binary search tree, and an integer k, return the kth smallest value (1-indexed) of all the values of the nodes in the tree.
6+
7+
// Example 1:
8+
9+
// Input: root = [3,1,4,null,2], k = 1
10+
// Output: 1
11+
12+
// Example 2:
13+
14+
// Input: root = [5,3,6,2,4,null,null,1], k = 3
15+
// Output: 3
16+
17+
// Constraints:
18+
19+
// The number of nodes in the tree is n.
20+
// 1 <= k <= n <= 104
21+
// 0 <= Node.val <= 104
22+
23+
package kthsmallestelementinabst
24+
25+
func kthSmallest(root *TreeNode, k int) int {
26+
sm := -1
27+
find(root, &k, &sm)
28+
return sm
29+
}
30+
31+
func find(root *TreeNode, k *int, sm *int) {
32+
if root == nil || *k == 0 {
33+
return
34+
}
35+
find(root.Left, k, sm)
36+
if *k > 0 {
37+
*sm = root.Val
38+
*k--
39+
}
40+
find(root.Right, k, sm)
41+
return
42+
}
43+
44+
type TreeNode struct {
45+
Val int
46+
Right *TreeNode
47+
Left *TreeNode
48+
}
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
package kthsmallestelementinabst
2+
3+
import "testing"
4+
5+
func TestKthSmallest(t *testing.T) {
6+
tests := []struct {
7+
name string
8+
root *TreeNode
9+
k int
10+
want int
11+
}{
12+
{
13+
name: "Example 1: k=1, smallest element",
14+
root: &TreeNode{
15+
Val: 3,
16+
Left: &TreeNode{
17+
Val: 1,
18+
Right: &TreeNode{Val: 2},
19+
},
20+
Right: &TreeNode{Val: 4},
21+
},
22+
k: 1,
23+
want: 1,
24+
},
25+
{
26+
name: "Example 2: k=3, middle element",
27+
root: &TreeNode{
28+
Val: 5,
29+
Left: &TreeNode{
30+
Val: 3,
31+
Left: &TreeNode{
32+
Val: 2,
33+
Left: &TreeNode{Val: 1},
34+
},
35+
Right: &TreeNode{Val: 4},
36+
},
37+
Right: &TreeNode{Val: 6},
38+
},
39+
k: 3,
40+
want: 3,
41+
},
42+
{
43+
name: "Single node tree",
44+
root: &TreeNode{Val: 1},
45+
k: 1,
46+
want: 1,
47+
},
48+
{
49+
name: "Two nodes, k=1",
50+
root: &TreeNode{
51+
Val: 2,
52+
Left: &TreeNode{Val: 1},
53+
},
54+
k: 1,
55+
want: 1,
56+
},
57+
{
58+
name: "Two nodes, k=2",
59+
root: &TreeNode{
60+
Val: 2,
61+
Left: &TreeNode{Val: 1},
62+
},
63+
k: 2,
64+
want: 2,
65+
},
66+
{
67+
name: "Right-skewed tree, k=1",
68+
root: &TreeNode{
69+
Val: 1,
70+
Right: &TreeNode{
71+
Val: 2,
72+
Right: &TreeNode{
73+
Val: 3,
74+
Right: &TreeNode{Val: 4},
75+
},
76+
},
77+
},
78+
k: 1,
79+
want: 1,
80+
},
81+
{
82+
name: "Right-skewed tree, k=4",
83+
root: &TreeNode{
84+
Val: 1,
85+
Right: &TreeNode{
86+
Val: 2,
87+
Right: &TreeNode{
88+
Val: 3,
89+
Right: &TreeNode{Val: 4},
90+
},
91+
},
92+
},
93+
k: 4,
94+
want: 4,
95+
},
96+
{
97+
name: "Left-skewed tree, k=1",
98+
root: &TreeNode{
99+
Val: 4,
100+
Left: &TreeNode{
101+
Val: 3,
102+
Left: &TreeNode{
103+
Val: 2,
104+
Left: &TreeNode{Val: 1},
105+
},
106+
},
107+
},
108+
k: 1,
109+
want: 1,
110+
},
111+
{
112+
name: "Left-skewed tree, k=3",
113+
root: &TreeNode{
114+
Val: 4,
115+
Left: &TreeNode{
116+
Val: 3,
117+
Left: &TreeNode{
118+
Val: 2,
119+
Left: &TreeNode{Val: 1},
120+
},
121+
},
122+
},
123+
k: 3,
124+
want: 3,
125+
},
126+
{
127+
name: "Balanced tree, k=last element",
128+
root: &TreeNode{
129+
Val: 4,
130+
Left: &TreeNode{
131+
Val: 2,
132+
Left: &TreeNode{Val: 1},
133+
Right: &TreeNode{Val: 3},
134+
},
135+
Right: &TreeNode{
136+
Val: 6,
137+
Left: &TreeNode{Val: 5},
138+
Right: &TreeNode{Val: 7},
139+
},
140+
},
141+
k: 7,
142+
want: 7,
143+
},
144+
{
145+
name: "Balanced tree, k=middle element",
146+
root: &TreeNode{
147+
Val: 4,
148+
Left: &TreeNode{
149+
Val: 2,
150+
Left: &TreeNode{Val: 1},
151+
Right: &TreeNode{Val: 3},
152+
},
153+
Right: &TreeNode{
154+
Val: 6,
155+
Left: &TreeNode{Val: 5},
156+
Right: &TreeNode{Val: 7},
157+
},
158+
},
159+
k: 4,
160+
want: 4,
161+
},
162+
{
163+
name: "Large values",
164+
root: &TreeNode{
165+
Val: 10000,
166+
Left: &TreeNode{Val: 5000},
167+
Right: &TreeNode{Val: 10004},
168+
},
169+
k: 2,
170+
want: 10000,
171+
},
172+
{
173+
name: "Values with 0",
174+
root: &TreeNode{
175+
Val: 1,
176+
Left: &TreeNode{Val: 0},
177+
Right: &TreeNode{Val: 2},
178+
},
179+
k: 1,
180+
want: 0,
181+
},
182+
}
183+
184+
for _, tt := range tests {
185+
t.Run(tt.name, func(t *testing.T) {
186+
got := kthSmallest(tt.root, tt.k)
187+
if got != tt.want {
188+
t.Errorf("kthSmallest() = %v, want %v", got, tt.want)
189+
}
190+
})
191+
}
192+
}

0 commit comments

Comments
 (0)