Skip to content

Commit c8c5c82

Browse files
committed
sol 105, 106, 654 and 704
1 parent bfbeb7c commit c8c5c82

File tree

4 files changed

+157
-0
lines changed

4 files changed

+157
-0
lines changed

c_code/105_buildTree_pre_in.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* struct TreeNode *left;
6+
* struct TreeNode *right;
7+
* };
8+
*/
9+
10+
// Good Job,理解到位,一次写对!!!
11+
// 根据前序和中序,构建一个二叉树
12+
struct TreeNode* build(int* preorder, int preStart, int preEnd, int* inorder, int inStart, int inEnd)
13+
{
14+
// base case
15+
if (inStart > inEnd) return NULL; // 叶子节点
16+
17+
// root operation
18+
struct TreeNode* root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
19+
// 前序遍历结果
20+
root->val = preorder[preStart];
21+
// 中序遍历来分界
22+
int i, idx = -1;
23+
for (i = inStart; i <= inEnd; i++) {
24+
if(inorder[i] == root->val) {
25+
idx = i;
26+
break;
27+
}
28+
}
29+
30+
// 递归生成左右子树
31+
int leftSize = idx - inStart;
32+
root->left = build(preorder, preStart + 1, preStart + leftSize,
33+
inorder, inStart, idx - 1);
34+
root->right = build(preorder, preStart + leftSize + 1, preEnd,
35+
inorder, idx + 1, inEnd);
36+
37+
return root;
38+
}
39+
40+
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
41+
if (preorder == NULL || inorder == NULL) return NULL;
42+
43+
return build(preorder, 0, preorderSize - 1, inorder, 0, inorderSize - 1);
44+
}

c_code/106_buildTree_post_in.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* struct TreeNode *left;
6+
* struct TreeNode *right;
7+
* };
8+
*/
9+
10+
// Good Job,理解到位,一次写对!!!
11+
// 根据后序和中序,构建一个二叉树
12+
// 在上个105题基础上,改写下标,8min搞定
13+
14+
struct TreeNode* build(int* inorder, int inStart, int inEnd, int* postorder, int postStart, int postEnd)
15+
{
16+
// base case
17+
if (inStart > inEnd) return NULL; // 叶子节点
18+
19+
// root operation
20+
struct TreeNode* root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
21+
// 后序遍历结果
22+
root->val = postorder[postEnd];
23+
// 中序遍历来分界
24+
int i, idx = -1;
25+
for (i = inStart; i <= inEnd; i++) {
26+
if(inorder[i] == root->val) {
27+
idx = i;
28+
break;
29+
}
30+
}
31+
32+
// 递归生成左右子树
33+
int leftSize = idx - inStart;
34+
root->left = build(inorder, inStart, idx - 1,
35+
postorder, postStart, postStart + leftSize - 1);
36+
root->right = build(inorder, idx + 1, inEnd,
37+
postorder, postStart + leftSize, postEnd - 1);
38+
39+
return root;
40+
}
41+
42+
struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize){
43+
if (postorder == NULL || inorder == NULL) return NULL;
44+
45+
return build(inorder, 0, inorderSize - 1, postorder, 0, postorderSize - 1);
46+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* struct TreeNode *left;
6+
* struct TreeNode *right;
7+
* };
8+
*/
9+
10+
// 闭区间 [left, right]
11+
struct TreeNode* buildMaxTree(int* nums, int left, int right)
12+
{
13+
// base case
14+
if (left > right) return NULL;
15+
16+
struct TreeNode* root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
17+
// 找到最大值做当前的根节点
18+
// debug code
19+
// int i, idx, maxVal = nums[left];
20+
// for (i = left + 1; i <= right; i++) { // 会报内存越界,待查看bug; =>需同步初始化idx=left
21+
// right code
22+
// int i, idx = left, maxVal = nums[left]; // 需同步初始化idx=left
23+
// for (i = left + 1; i <= right; i++) { // 否则会报内存越界
24+
25+
int i, idx, maxVal = INT_MIN;
26+
for (i = left; i <= right; i++) {
27+
if (nums[i] > maxVal) {
28+
maxVal = nums[i];
29+
idx = i;
30+
}
31+
}
32+
root->val = maxVal;
33+
34+
// 递归调用生成左右子树
35+
root->left = buildMaxTree(nums, left, idx - 1);
36+
root->right = buildMaxTree(nums, idx + 1, right);
37+
38+
return root;
39+
}
40+
41+
42+
struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize){
43+
if (nums == NULL) return NULL;
44+
45+
return buildMaxTree(nums, 0, numsSize - 1);
46+
47+
}

c_code/704_search.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
int search(int* nums, int numsSize, int target){
2+
if (nums == NULL) return -1;
3+
int left = 0;
4+
int right = numsSize - 1; // 左闭右闭区间
5+
6+
while (left <= right) {
7+
int mid = left + (right - left) / 2;
8+
9+
if (nums[mid] == target) {
10+
return mid;
11+
} else if (nums[mid] < target) {
12+
left = mid + 1;
13+
} else if (nums[mid] > target) {
14+
right = mid - 1;
15+
}
16+
}
17+
18+
return -1; // 遍历完未找到
19+
20+
}

0 commit comments

Comments
 (0)