BST Node Distance
public class Solution {
public int bstDistance(int[] numbers, int node1, int node2) {
//corner case : numbers null and length ; is two nodes in the tree
if (number == null || numbers.length == 0) return -1;
if (!check(numbers, node1, node2)) return -1;
//use int[] numbers to build a tree
TreeNode root = buildTree(numbers);
//find the lowest ancestor node(root) for node1 and node2;
TreeNode keyRoot = findKeyRoot(root, node1, node2);
//both on left, or both on right, or one on left, one on right
return findDis(root, node1) + findDis(root, node2);
}
private boolean check(int[] numbers, int node1, int node2) {
Set<Integer> set = new HashSet<>();
for (int i = 0; i < numbers.length; i++) {
set.add(numbers[i]);
}
return set.contains(node1) && set.contains(node2);
}
private buildTree(int[] numbers) {
TreeNode root = new TreeNode(numbers[0]);
for (int i = 1; i < numbers.length; i++){
insert(root, numbers[i]);
}
return root;
}
private TreeNode insert(TreeNode root, int node) { //recursion - 按值插入BST
if (root == null) return new TreeNode(node);
if (root.val > node) {
root.left = insert(root.left, node);
} else if (root.val < node) {
root.right = insert(root.right, node);
}
return root;
}
private int findDis(TreeNode root, int node) { //TreeNode 距离
int dis = 0;
while (root.val != node) {
dis++;
if (root.val > node) {
root = root.right;
} else {
root = root.left;
}
}
return dis;
}
}
最后更新于
这有帮助吗?