|
| 1 | +/* |
| 2 | + * 根据前序遍历和中序遍历构建二叉树的递归函数 |
| 3 | + * |
| 4 | + * @param preorder 前序遍历数组指针 |
| 5 | + * @param inorderMap 中序遍历值到索引的映射数组 |
| 6 | + * @param i 当前子树在前序遍历数组中的根节点索引 |
| 7 | + * @param l 当前子树在中序遍历数组中的左边界 |
| 8 | + * @param r 当前子树在中序遍历数组中的右边界 |
| 9 | + * @param size 树的总节点数(用于边界检查) |
| 10 | + * @return TreeNode* 构建好的子树根节点 |
| 11 | + */ |
| 12 | +TreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) { |
| 13 | + if (r - l < 0) { |
| 14 | + return NULL; |
| 15 | + } |
| 16 | + |
| 17 | + TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode)); |
| 18 | + root->val=preorder[i]; |
| 19 | + root->left = NULL; |
| 20 | + root->right = NULL; |
| 21 | + int m = inorderMap[preorder[i]]; |
| 22 | + root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size); |
| 23 | + root->right = dfs(preorder, inorderMap, i + 1 + m -l, m + 1, r, size); |
| 24 | + return root; |
| 25 | +} |
| 26 | + |
| 27 | +/* |
| 28 | + * 根据前序遍历和中序遍历构建二叉树的主函数 |
| 29 | + * |
| 30 | + * @param preorder 前序遍历数组指针 |
| 31 | + * @param preorderSize 前序遍历数组长度 |
| 32 | + * @param inorder 中序遍历数组指针 |
| 33 | + * @param inorderSize 中序遍历数组长度 |
| 34 | + * @return TreeNode* 构建好的二叉树根节点 |
| 35 | + */ |
| 36 | +TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) { |
| 37 | + int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE); |
| 38 | + for(int i = 0; i < inorderSize; i++) { |
| 39 | + inorderMap[inorder[i]] = i; |
| 40 | + } |
| 41 | + TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize); |
| 42 | + free(inorderMap); |
| 43 | +} |
0 commit comments