public int Diameter() { HeightPath height = new HeightPath(); var diameterRecursive = DiameterRecursive(root, height); return(diameterRecursive > 0 ? diameterRecursive - 1 : diameterRecursive); }
private int DiameterRecursive(TreeNode node, HeightPath height) { if (node == null) { height.Height = 0; return(0); } var leftPathHeight = new HeightPath(); var rightPathHeight = new HeightPath(); int leftDiameter = DiameterRecursive(node.left, leftPathHeight); int rightDiameter = DiameterRecursive(node.right, rightPathHeight); height.Height = Math.Max(leftPathHeight.Height, rightPathHeight.Height) + 1; return(Math.Max(leftPathHeight.Height + rightPathHeight.Height + 1, Math.Max(leftDiameter, rightDiameter))); }