Node ReconstructTreeHelper(SubArray<int> preorder, SubArray<int> inorder, Dictionary<int, int> inorderMapTable) { int rootVal = preorder[0]; int rootPos = inorderMapTable[rootVal] - inorder.Offset; Node node = new Node { Id = rootVal }; int nodesToLeft = rootPos; if (nodesToLeft > 0) node.Left = ReconstructTreeHelper(preorder.SubArray(1, nodesToLeft), inorder.SubArray(0, nodesToLeft), inorderMapTable); int nodesToRight = inorder.Count - rootPos - 1; if (nodesToRight > 0) node.Right = ReconstructTreeHelper(preorder.SubArray(rootPos + 1, nodesToRight), inorder.SubArray(rootPos + 1, nodesToRight), inorderMapTable); return node; }