Skip to content

Commit 28586fa

Browse files
committed
补充前序遍历的解法思路
1 parent 28ba376 commit 28586fa

File tree

1 file changed

+258
-1
lines changed

1 file changed

+258
-1
lines changed

01.阿里篇/1.1.3 给定一个二叉搜索树(BST),找到树中第 K 小的节点.md

+258-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
```
2020
说明:保证输入的 K 满足 1<=K<=(节点数目)
2121

22-
树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。
22+
解法1:树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。
2323

2424
```
2525
/**
@@ -79,3 +79,260 @@ class Solution {
7979
8080
```
8181

82+
解法2:基于二叉搜索树的特性,在前序遍历的结果中,第k个元素就是本题的解。
83+
最差的情况是k节点是bst的最右叶子节点,不过`每个节点的遍历次数最多是1次`
84+
遍历并不是需要全部做完,使用计数的方式,找到第k个元素就可以退出。
85+
下面是go的一个简单实现。
86+
87+
```
88+
// BST is binary search tree
89+
type BST struct {
90+
key, value int
91+
left, right *BST
92+
}
93+
94+
func (bst *BST) setLeft(b *BST) {
95+
bst.left = b
96+
}
97+
98+
func (bst *BST) setRight(b *BST) {
99+
bst.right = b
100+
}
101+
102+
// count 查找bst第k个节点的值,未找到就返回0
103+
func count(bst *BST, k int) int {
104+
if k < 1 {
105+
return 0
106+
}
107+
108+
c := 0
109+
ok, value := countRecursive(bst, &c, k)
110+
111+
if ok {
112+
return value
113+
}
114+
115+
return 0
116+
}
117+
118+
// countRecurisive 对bst使用前序遍历
119+
// 用计数方式控制退出遍历,参数c就是已遍历节点数
120+
func countRecursive(bst *BST, c *int, k int) (bool, int) {
121+
if bst.left != nil {
122+
ok, value := countRecursive(bst.left, c, k)
123+
if ok {
124+
return ok, value
125+
}
126+
}
127+
128+
if *c == k-1 {
129+
return true, bst.value
130+
}
131+
132+
*c++
133+
134+
if bst.right != nil {
135+
ok, value := countRecursive(bst.right, c, k)
136+
if ok {
137+
return ok, value
138+
}
139+
}
140+
141+
return false, 0
142+
}
143+
144+
// 下面是测试代码,覆盖了退化的情况和普通bst
145+
146+
func createBST1() *BST {
147+
b1 := &BST{key: 1, value: 10}
148+
b2 := &BST{key: 2, value: 20}
149+
b3 := &BST{key: 3, value: 30}
150+
b4 := &BST{key: 4, value: 40}
151+
b5 := &BST{key: 5, value: 50}
152+
b6 := &BST{key: 6, value: 60}
153+
b7 := &BST{key: 7, value: 70}
154+
b8 := &BST{key: 8, value: 80}
155+
b9 := &BST{key: 9, value: 90}
156+
157+
b9.setLeft(b8)
158+
b8.setLeft(b7)
159+
b7.setLeft(b6)
160+
b6.setLeft(b5)
161+
b5.setLeft(b4)
162+
b4.setLeft(b3)
163+
b3.setLeft(b2)
164+
b2.setLeft(b1)
165+
166+
return b9
167+
}
168+
169+
func createBST2() *BST {
170+
b1 := &BST{key: 1, value: 10}
171+
b2 := &BST{key: 2, value: 20}
172+
b3 := &BST{key: 3, value: 30}
173+
b4 := &BST{key: 4, value: 40}
174+
b5 := &BST{key: 5, value: 50}
175+
b6 := &BST{key: 6, value: 60}
176+
b7 := &BST{key: 7, value: 70}
177+
b8 := &BST{key: 8, value: 80}
178+
b9 := &BST{key: 9, value: 90}
179+
180+
b1.setRight(b2)
181+
b2.setRight(b3)
182+
b3.setRight(b4)
183+
b4.setRight(b5)
184+
b5.setRight(b6)
185+
b6.setRight(b7)
186+
b7.setRight(b8)
187+
b8.setRight(b9)
188+
189+
return b1
190+
}
191+
192+
func createBST3() *BST {
193+
b1 := &BST{key: 1, value: 10}
194+
b2 := &BST{key: 2, value: 20}
195+
b3 := &BST{key: 3, value: 30}
196+
b4 := &BST{key: 4, value: 40}
197+
b5 := &BST{key: 5, value: 50}
198+
b6 := &BST{key: 6, value: 60}
199+
b7 := &BST{key: 7, value: 70}
200+
b8 := &BST{key: 8, value: 80}
201+
b9 := &BST{key: 9, value: 90}
202+
203+
b5.setLeft(b3)
204+
b5.setRight(b7)
205+
b3.setLeft(b2)
206+
b3.setRight(b4)
207+
b2.setLeft(b1)
208+
b7.setLeft(b6)
209+
b7.setRight(b8)
210+
b8.setRight(b9)
211+
212+
return b5
213+
}
214+
215+
func createBST4() *BST {
216+
b := &BST{key: 1, value: 10}
217+
last := b
218+
219+
for i := 2; i < 100000; i++ {
220+
n := &BST{key: i, value: i * 10}
221+
last.setRight(n)
222+
223+
last = n
224+
}
225+
226+
return b
227+
}
228+
229+
func createBST5() *BST {
230+
b := &BST{key: 99999, value: 999990}
231+
last := b
232+
233+
for i := 99998; i > 0; i-- {
234+
n := &BST{key: i, value: i * 10}
235+
last.setLeft(n)
236+
237+
last = n
238+
}
239+
240+
return b
241+
}
242+
243+
func createBST6() *BST {
244+
b := &BST{key: 50000, value: 500000}
245+
last := b
246+
247+
for i := 49999; i > 0; i-- {
248+
n := &BST{key: i, value: i * 10}
249+
last.setLeft(n)
250+
251+
last = n
252+
}
253+
254+
last = b
255+
256+
for i := 50001; i < 100000; i++ {
257+
n := &BST{key: i, value: i * 10}
258+
last.setRight(n)
259+
260+
last = n
261+
}
262+
263+
return b
264+
}
265+
266+
func TestK(t *testing.T) {
267+
bst1 := createBST1()
268+
bst2 := createBST2()
269+
bst3 := createBST3()
270+
bst4 := createBST4()
271+
272+
check(t, bst1, 1, 10)
273+
check(t, bst1, 2, 20)
274+
check(t, bst1, 3, 30)
275+
check(t, bst1, 4, 40)
276+
check(t, bst1, 5, 50)
277+
check(t, bst1, 6, 60)
278+
check(t, bst1, 7, 70)
279+
check(t, bst1, 8, 80)
280+
check(t, bst1, 9, 90)
281+
282+
check(t, bst2, 1, 10)
283+
check(t, bst2, 2, 20)
284+
check(t, bst2, 3, 30)
285+
check(t, bst2, 4, 40)
286+
check(t, bst2, 5, 50)
287+
check(t, bst2, 6, 60)
288+
check(t, bst2, 7, 70)
289+
check(t, bst2, 8, 80)
290+
check(t, bst2, 9, 90)
291+
292+
check(t, bst3, 1, 10)
293+
check(t, bst3, 2, 20)
294+
check(t, bst3, 3, 30)
295+
check(t, bst3, 4, 40)
296+
check(t, bst3, 5, 50)
297+
check(t, bst3, 6, 60)
298+
check(t, bst3, 7, 70)
299+
check(t, bst3, 8, 80)
300+
check(t, bst3, 9, 90)
301+
302+
check(t, bst4, 1, 10)
303+
check(t, bst4, 2, 20)
304+
check(t, bst4, 3, 30)
305+
check(t, bst4, 4, 40)
306+
check(t, bst4, 5, 50)
307+
check(t, bst4, 6, 60)
308+
check(t, bst4, 7, 70)
309+
check(t, bst4, 8, 80)
310+
check(t, bst4, 9, 90)
311+
312+
check(t, bst4, 99991, 999910)
313+
check(t, bst4, 99992, 999920)
314+
check(t, bst4, 99993, 999930)
315+
check(t, bst4, 99994, 999940)
316+
check(t, bst4, 99995, 999950)
317+
check(t, bst4, 99996, 999960)
318+
check(t, bst4, 99997, 999970)
319+
check(t, bst4, 99998, 999980)
320+
check(t, bst4, 99999, 999990)
321+
}
322+
323+
func check(t *testing.T, b *BST, k, value int) {
324+
t.Helper()
325+
326+
checkCall(t, b, k, value, count)
327+
// 此处可添加其他解法的实现
328+
}
329+
330+
func checkCall(t *testing.T, b *BST, k, value int, find func(bst *BST, kth int) int) {
331+
t.Helper()
332+
333+
got := find(b, k)
334+
if got != value {
335+
t.Fatalf("want:%d, got:%d", value, got)
336+
}
337+
}
338+
```

0 commit comments

Comments
 (0)