dengxinyi 6 лет назад
Родитель
Сommit
157cdf3a49
1 измененных файлов с 60 добавлено и 0 удалено
  1. 60 0
      oj/microsoft-2019-sim/1/main.go

+ 60 - 0
oj/microsoft-2019-sim/1/main.go

@@ -0,0 +1,60 @@
+package main
+
+import "fmt"
+
+// Get the distance of two nodes in binary tree
+
+var finalDist int
+
+func main() {
+	distOf(1, 12, 12)
+	fmt.Println(finalDist, 0)
+	distOf(1, 12, 6)
+	fmt.Println(finalDist, 1)
+	distOf(1, 4, 5)
+	fmt.Println(finalDist, 2)
+	distOf(1, 1, 11)
+	fmt.Println(finalDist, 3)
+	distOf(1, 5, 6)
+	fmt.Println(finalDist, 4)
+	distOf(1, 6, 9)
+	fmt.Println(finalDist, 5)
+	distOf(1, 8, 15)
+	fmt.Println(finalDist, 6)
+}
+
+//           __1__
+//         _/     \_
+//        /         \
+//      _2_         _3_
+//     /   \       /   \
+//    4     5     6     7
+//   / \   / \   / \   / \
+//  8   9 10 11 12 13 14 15
+func distOf(root, p, q int) int {
+	if p < root && q < root {
+		return -1
+	}
+	left := distOf(root*2, p, q) + 1
+	right := distOf(root*2+1, p, q) + 1
+	if left != 0 && right != 0 {
+		finalDist = left + right
+		return left
+	}
+	if left != 0 {
+		if root == p || root == q {
+			finalDist = left
+		}
+		return left
+	}
+	if right != 0 {
+		if root == p || root == q {
+			finalDist = right
+		}
+		return right
+	}
+	if root == p || root == q {
+		return 0
+	}
+	return -1
+}