public int[] getMax(TreeNode p_root) {

        if (p_root.getLeft() == null && p_root.getRight() == null) {
            return new int[] {0, 0};
        } else if (p_root.getLeft() != null && p_root.getRight() != null) {
            int[] l_left = getMax(p_root.getLeft());
            int[] l_right = getMax(p_root.getRight());

            int l_maxCurrent = l_left[1] + l_right[1] + 2;
            l_maxCurrent = l_maxCurrent > l_left[0] ? l_maxCurrent : l_left[0];
            l_maxCurrent = l_maxCurrent > l_right[0] ? l_maxCurrent : l_right[0];

            int l_maxBranch = (l_left[1] > l_right[1] ? l_left[1] : l_right[1]) + 1;

            return new int[] {l_maxCurrent, l_maxBranch};
        }

        TreeNode l_subTreeRoot = p_root.getLeft() != null ? p_root.getLeft() : p_root.getRight();

        return getMaxSingleSubTree(l_subTreeRoot);
    }