|
19 | 19 | ```
|
20 | 20 | 说明:保证输入的 K 满足 1<=K<=(节点数目)
|
21 | 21 |
|
22 |
| -树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。 |
| 22 | +解法1:树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。 |
23 | 23 |
|
24 | 24 | ```
|
25 | 25 | /**
|
@@ -79,3 +79,260 @@ class Solution {
|
79 | 79 |
|
80 | 80 | ```
|
81 | 81 |
|
| 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