99.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package main
  2. import (
  3. "math"
  4. )
  5. /**
  6. * Definition for a binary tree node.
  7. * type TreeNode struct {
  8. * Val int
  9. * Left *TreeNode
  10. * Right *TreeNode
  11. * }
  12. */
  13. func recoverTree(root *TreeNode) {
  14. if root == nil {
  15. return
  16. }
  17. var swap1, swap2 *TreeNode
  18. prev := &TreeNode{math.MinInt32, nil, nil}
  19. var recurse func(*TreeNode)
  20. recurse = func(root *TreeNode) {
  21. if root == nil {
  22. return
  23. }
  24. recurse(root.Left)
  25. // It's kinda strange, but there's an example:
  26. // 1 2 6 4 5 3
  27. // The first element must be the larger one, so pick prev;
  28. // the second element is the smaller one, pick root.
  29. if swap1 == nil && root.Val <= prev.Val {
  30. swap1 = prev
  31. }
  32. if swap1 != nil && root.Val <= prev.Val {
  33. swap2 = root
  34. }
  35. prev = root
  36. recurse(root.Right)
  37. }
  38. recurse(root)
  39. swap1.Val, swap2.Val = swap2.Val, swap1.Val
  40. }
  41. // func main() {
  42. // tree := toBinaryTree(nil)
  43. // recoverTree(tree)
  44. // printTree(tree)
  45. // tree = toBinaryTree(newInt(1), newInt(3), nil, nil, newInt(2))
  46. // recoverTree(tree)
  47. // printTree(tree)
  48. // tree = toBinaryTree(newInt(3), newInt(1), newInt(4), nil, nil, newInt(2))
  49. // recoverTree(tree)
  50. // printTree(tree)
  51. // }