private int FindInorderIndexByValue(int[] inorder, SubTreeSpan inorderSpan, int targetVal) { for (int i = inorderSpan.StartIndex; i <= inorderSpan.EndIndex; i++) { if (inorder[i] == targetVal) { return(i); } } throw new ArgumentException($"Can not find target value in given inorder span. Target value is {targetVal}", nameof(targetVal)); }
private TreeNode BuildSubTree(int[] inorder, SubTreeSpan inorderSpan, int[] postorder, SubTreeSpan postorderSpan) { if (inorderSpan.StartIndex == inorderSpan.EndIndex) { if (inorder[inorderSpan.StartIndex] == postorder[postorderSpan.EndIndex]) { return(new TreeNode(inorder[inorderSpan.StartIndex])); } else { throw new ArgumentException(); } } else if (inorderSpan.StartIndex > inorderSpan.EndIndex) { return(null); } var rootVal = postorder[postorderSpan.EndIndex]; var rootNode = new TreeNode(rootVal); var subtreeDivider = FindInorderIndexByValue(inorder, inorderSpan, rootVal); rootNode.left = BuildSubTree( inorder, new SubTreeSpan(inorderSpan.StartIndex, subtreeDivider - 1), postorder, new SubTreeSpan(postorderSpan.StartIndex, postorderSpan.StartIndex + subtreeDivider - inorderSpan.StartIndex - 1)); rootNode.right = BuildSubTree( inorder, new SubTreeSpan(subtreeDivider + 1, inorderSpan.EndIndex), postorder, new SubTreeSpan(postorderSpan.StartIndex + subtreeDivider - inorderSpan.StartIndex, postorderSpan.EndIndex - 1)); return(rootNode); }