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;
	}
}

最后更新于

这有帮助吗?