package com.interview.algorithms.tree;
import com.interview.basics.model.collection.list.List;
import com.interview.basics.model.tree.BinarySearchTree;
import com.interview.utils.BinaryTreePrinter;
import com.interview.utils.ConsoleReader;
import java.util.HashMap;
import java.util.Map;
/**
* Given a BinarySearchTree and value K, find all value pairs whose sum is K in O(n).
*
* @author zouzhile (zouzhile@gmail.com)
*
*/
public class C5_7_KValueNodePairSearch {
public HashMap<Integer, Integer> search(BinarySearchTree tree, int K) {
HashMap<Integer, Integer> pairs = new HashMap<Integer, Integer>();
AddListProcessor<Integer> processor = new AddListProcessor<>();
C5_1_TreeTraverse.traverseByInOrder(tree.getRoot(), processor);
List<Integer> sortedValues = processor.list;
int head = 0;
int tail = sortedValues.size() - 1;
while(head < tail) {
int small = sortedValues.get(head);
int large = sortedValues.get(tail);
int sum = small + large;
if(sum > K)
tail -- ;
if(sum < K)
head ++;
if(sum == K) {
pairs.put(small, large);
head ++;
tail --;
}
}
return pairs;
}
public static void main(String[] args){
System.out.println("The K Value Node Pair Search Implementation");
System.out.println("The Binary Tree is below: ");
Integer[] data = new Integer[]{15, 6, 18, 3, 7, 17, 20, 2, 4, 13, 9};
BinarySearchTree<Integer> tree = new BinarySearchTree<Integer>(data);
BinaryTreePrinter.print(tree.getRoot());
System.out.print("Please input sum value for the node pair: ");
int target = new ConsoleReader().readInt();
System.out.println();
C5_7_KValueNodePairSearch searcher = new C5_7_KValueNodePairSearch();
HashMap<Integer, Integer> pairs = searcher.search(tree, target);
if(! pairs.isEmpty()) {
System.out.println("K Value Node Pairs Found !");
for(Map.Entry<Integer, Integer> pairEntry : pairs.entrySet()) {
Integer key = pairEntry.getKey();
Integer value = pairEntry.getValue();
System.out.println("\t" + key + "\t" + value);
}
}
else
System.out.println("K Value Node Pair NOT Found !");
}
}