package com.anuragkapur.pie.teesandgraphs; import com.anuragkapur.ds.tree.Node; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; /** * @author anuragkapur */ public class BinaryTreeToHeap { public Node<Integer> convert(Node<Integer> root) { Node<Integer> nodes[] = getNodesArray(root); // sort in descending order Arrays.sort(nodes, new Comparator<Node<Integer>>() { @Override public int compare(Node<Integer> o1, Node<Integer> o2) { if (o1.getData() < o2.getData()) return 1; else if (o1.getData() > o2.getData()) return -1; else return 0; } }); return getBinaryTreeBackedHeap(nodes); } private Node<Integer> getBinaryTreeBackedHeap(Node<Integer>[] nodes) { if (nodes == null) { return null; } for (int i = 0; i < nodes.length; i++) { Node<Integer> node = nodes[i]; if (2*i+1 < nodes.length) { node.setLeft(nodes[2*i+1]); } if (2*i+2 < nodes.length) { node.setRight(nodes[2*i+2]); } } return nodes[0]; } private Node<Integer>[] getNodesArray(Node<Integer> root) { List<Node<Integer>> nodeList = preorder(root, null); Node<Integer>[] nodes = new Node[nodeList.size()]; nodeList.toArray(nodes); return nodes; } private List<Node<Integer>> preorder(Node<Integer> root, List<Node<Integer>> nodeList) { if (root != null) { if (nodeList == null) { nodeList = new ArrayList<>(); } nodeList.add(root); preorder(root.getLeft(), nodeList); preorder(root.getRight(), nodeList); root.setLeft(null); root.setRight(null); } return nodeList; } }