main.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package main
  2. import "fmt"
  3. // Get the distance of two nodes in binary tree
  4. var finalDist int
  5. func main() {
  6. distOf(1, 12, 12)
  7. fmt.Println(finalDist, 0)
  8. distOf(1, 12, 6)
  9. fmt.Println(finalDist, 1)
  10. distOf(1, 4, 5)
  11. fmt.Println(finalDist, 2)
  12. distOf(1, 1, 11)
  13. fmt.Println(finalDist, 3)
  14. distOf(1, 5, 6)
  15. fmt.Println(finalDist, 4)
  16. distOf(1, 6, 9)
  17. fmt.Println(finalDist, 5)
  18. distOf(1, 8, 15)
  19. fmt.Println(finalDist, 6)
  20. }
  21. // __1__
  22. // _/ \_
  23. // / \
  24. // _2_ _3_
  25. // / \ / \
  26. // 4 5 6 7
  27. // / \ / \ / \ / \
  28. // 8 9 10 11 12 13 14 15
  29. func distOf(root, p, q int) int {
  30. if p < root && q < root {
  31. return -1
  32. }
  33. left := distOf(root*2, p, q) + 1
  34. right := distOf(root*2+1, p, q) + 1
  35. if left != 0 && right != 0 {
  36. finalDist = left + right
  37. return left
  38. }
  39. if left != 0 {
  40. if root == p || root == q {
  41. finalDist = left
  42. }
  43. return left
  44. }
  45. if right != 0 {
  46. if root == p || root == q {
  47. finalDist = right
  48. }
  49. return right
  50. }
  51. if root == p || root == q {
  52. return 0
  53. }
  54. return -1
  55. }