package com.interview.tree; /** * http://www.geeksforgeeks.org/vertex-cover-problem-set-2-dynamic-programming-solution-tree/ * http://en.wikipedia.org/wiki/Vertex_cover * Using lis to store the cover data * Test cases: * null root * Only left child * Only right child * Tree with only one child at every node */ public class VertexCoverBinaryTreeDP { public int cover(Node root){ if(root == null){ return 0; } //no need to include leaf node ever if(root.left == null && root.right == null){ return 0; } //store result if(root.lis != -1){ return root.lis; } //if root is included int inclRoot = 1 + cover(root.left) + cover(root.right); int exclRoot = 0; //if root is not included if(root.left!=null){ exclRoot += (1 + cover(root.left.left) + cover(root.left.right)); } if(root.right!=null){ exclRoot += (1 + cover(root.right.left) + cover(root.right.right)); } root.lis = Math.min(inclRoot, exclRoot); return root.lis; } public static void main(String args[]){ BinaryTree bt = new BinaryTree(); Node root = null; root = bt.addNode(10, root); root = bt.addNode(0, root); root = bt.addNode(-5, root); root = bt.addNode(5, root); root = bt.addNode(7, root); root = bt.addNode(3, root); root = bt.addNode(30, root); root = bt.addNode(40, root); root = bt.addNode(25, root); root = bt.addNode(46, root); root = bt.addNode(-8, root); root = bt.addNode(-2, root); root = bt.addNode(-1, root); root = bt.addNode(28, root); VertexCoverBinaryTreeDP vc = new VertexCoverBinaryTreeDP(); System.out.println(vc.cover(root)); } }