Skip to content

Commit 56a3d08

Browse files
committed
build_tree1.c
1 parent 7f13f15 commit 56a3d08

1 file changed

Lines changed: 43 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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

Comments
 (0)