给定一棵有n个结点的二叉树的先序遍历与后序遍历序列,求其中序遍历序列。
若某节点只有一个子结点,则此处将其看作左儿子结点
struct TreeNode* buildTree(int* pre, int* post, int i, int j, int n) { if (n <= 0) return NULL; struct TreeNode* root = (struct TreeNode*) malloc(sizeof(struct TreeNode)); root->val = *(pre + i); root->left = root->right = NULL; if (n == 1) return root; int k = j; while (*(post + k) != *(pre + i + 1)) ++k; int l = k - j + 1; // the length of left sub tree root->left = buildTree(pre, post, i + 1, j, l); root->right = buildTree(pre, post, i + 1 + l, k + 1, n - 1 - l); return root; } void inorderTraversal(struct TreeNode* root, int* ans, int* ansSize) { if (!root) return; inorderTraversal(root->left, ans, ansSize); *(ans + (*ansSize)++) = root->val; inorderTraversal(root->right, ans, ansSize); } /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int 二叉树节点数量 * @param pre int一维数组 前序序列 * @param preLen int pre数组长度 * @param suf int一维数组 后序序列 * @param sufLen int suf数组长度 * @return int一维数组 * @return int* returnSize 返回数组行数 */ int* solve(int n, int* pre, int preLen, int* suf, int sufLen, int* returnSize) { *returnSize = 0; int* ans = (int*) malloc(n * sizeof(int)); if (!ans) return NULL; struct TreeNode* root = buildTree(pre, suf, 0, 0, n); inorderTraversal(root, ans, returnSize); return ans; }