图片.png
    二叉搜索树的中序遍历就是升序排序

    1. package main
    2. import "fmt"
    3. type TreeNode struct {
    4. Val int
    5. Left *TreeNode
    6. Right *TreeNode
    7. }
    8. // 中序遍历
    9. func kthSmallest(root *TreeNode, k int) int {
    10. if root==nil{
    11. return 0
    12. }
    13. stack := make([]*TreeNode,0)
    14. i :=0
    15. for root!=nil||len(stack)>0{
    16. if root!= nil {
    17. stack = append(stack,root)
    18. root = root.Left
    19. }else {
    20. curr :=stack[len(stack)-1]
    21. stack = stack[:len(stack)-1]
    22. // 数据出站
    23. if i==k-1 {
    24. return curr.Val
    25. }
    26. i++
    27. root = curr.Right
    28. }
    29. }
    30. return 0
    31. }
    32. func main() {
    33. a := &TreeNode{
    34. Val: 3,
    35. }
    36. b := &TreeNode{
    37. Val: 1,
    38. }
    39. a.Left = b
    40. c := &TreeNode{
    41. Val: 4,
    42. }
    43. a.Right = c
    44. d := &TreeNode{
    45. Val: 2,
    46. }
    47. b.Right = d
    48. fmt.Println(kthSmallest(a,1))
    49. }

    图片.png

    递归

    1. func kthSmallest1(root *TreeNode, k int) int{
    2. index = k
    3. dfs(root)
    4. return res
    5. }
    6. var res int
    7. var index int
    8. func dfs(root *TreeNode){
    9. if root==nil {
    10. return
    11. }
    12. dfs(root.Left)
    13. if index==0 {
    14. res = root.Val
    15. return
    16. }
    17. dfs(root.Right)
    18. }