private int toChildSumTree(Node root){
        if(root == null){
            return 0;
        }
        
        if(root.left == null && root.right == null){
            return root.data;
        }
        
        int sum1 = toChildSumTree(root.left);
        int sum2 = toChildSumTree(root.right);
        if(root.data < sum1 + sum2){
            root.data = sum1 + sum2;
        }else if(root.data > sum1 + sum2){
            incrementChild(root,root.data - sum1 - sum2);
        }
        return root.data;
    }
http://www.geeksforgeeks.org/convert-an-arbitrary-binary-tree-to-a-tree-that-holds-children-sum-property/
Only operation you can do is increase data on the node. No decrement of data
Test case
Root greater than children
Root less than children
Root equal to children
src/com/interview/tree/ArbitaryTreeToChildSumTree.java