main.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. // Get the distance of two nodes in binary tree
  7. var finalDist int
  8. func main() {
  9. distOf(1, 12, 12)
  10. fmt.Println(finalDist, 0, getDistof(12, 12))
  11. distOf(1, 12, 6)
  12. fmt.Println(finalDist, 1, getDistof(12, 6))
  13. distOf(1, 4, 5)
  14. fmt.Println(finalDist, 2, getDistof(4, 5))
  15. distOf(1, 1, 11)
  16. fmt.Println(finalDist, 3, getDistof(1, 11))
  17. distOf(1, 5, 6)
  18. fmt.Println(finalDist, 4, getDistof(5, 6))
  19. distOf(1, 6, 9)
  20. fmt.Println(finalDist, 5, getDistof(6, 9))
  21. distOf(1, 8, 15)
  22. fmt.Println(finalDist, 6, getDistof(8, 15))
  23. distOf(1, 21, 13)
  24. fmt.Println(finalDist, 7, getDistof(21, 13))
  25. distOf(1, 101, 5)
  26. fmt.Println(finalDist, 8, getDistof(101, 5))
  27. distOf(1, 11, 101)
  28. fmt.Println(finalDist, 9, getDistof(11, 101))
  29. }
  30. // __1__
  31. // _/ \_
  32. // / \
  33. // _2_ _3_
  34. // / \ / \
  35. // 4 5 6 7
  36. // / \ / \ / \ / \
  37. // 8 9 10 11 12 13 14 15
  38. func distOf(root, p, q int) int {
  39. if p < root && q < root {
  40. return -1
  41. }
  42. left := distOf(root*2, p, q) + 1
  43. right := distOf(root*2+1, p, q) + 1
  44. if left != 0 && right != 0 {
  45. finalDist = left + right
  46. return left
  47. }
  48. if left != 0 {
  49. if root == p || root == q {
  50. finalDist = left
  51. }
  52. return left
  53. }
  54. if right != 0 {
  55. if root == p || root == q {
  56. finalDist = right
  57. }
  58. return right
  59. }
  60. if root == p || root == q {
  61. return 0
  62. }
  63. return -1
  64. }
  65. func getDistof(p, q int) (dist int) {
  66. lp := int(math.Log2(float64(p)))
  67. lq := int(math.Log2(float64(q)))
  68. if lp != lq {
  69. det := abs(lp - lq)
  70. dist += det
  71. if lp < lq {
  72. q >>= uint(det)
  73. } else {
  74. p >>= uint(det)
  75. }
  76. }
  77. for ; p != q; p, q = p/2, q/2 {
  78. dist += 2
  79. }
  80. return
  81. }
  82. func abs(x int) int {
  83. if x < 0 {
  84. return -x
  85. }
  86. return x
  87. }