654. 最大二叉树
题目链接
解
struct TreeNode *build_tree(int *nums, int left, int right) {
if (left >= right) {
return NULL;
}
int idx = left;
for(int i = left+1; i < right; i++) {
if (nums[i] > nums[idx]) idx = i;
}
struct TreeNode *node = (struct TreeNode *)malloc(sizeof(struct TreeNode));
node->val = nums[idx];
node->left = build_tree(nums, left, idx);
node->right = build_tree(nums, idx+1, right);
return node;
}
struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {
return build_tree(nums, 0, numsSize);
}
617. 合并二叉树
题目链接
解: 递归
struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2) {
if (root1 == NULL) return root2;
if (root2 == NULL) return root1;
root1->val += root2->val;
root1->left = mergeTrees(root1->left, root2->left);
root1->right = mergeTrees(root1->right, root2->right);
return root1;
}
700. 二叉搜索树中的搜索
题目链接
解: 递归
struct TreeNode* searchBST(struct TreeNode* root, int val) {
if (root == NULL || root->val == val) return root;
struct TreeNode *ret = NULL;
if (root->val > val) ret = searchBST(root->left, val);
if (root->val < val) ret = searchBST(root->right, val);
return ret;
}
解: 迭代
struct TreeNode* searchBST(struct TreeNode* root, int val) {
while (root != NULL) {
if (root->val > val) root = root->left;
else if (root->val < val) root = root->right;
else return root;
}
return NULL;
}
98. 验证二叉搜索树
题目链接
解
struct stack {
int top;
struct TreeNode *array[10005];
};
bool isValidBST(struct TreeNode* root) {
struct stack *st = (struct stack *)malloc(sizeof(struct stack));
struct TreeNode *node = root;
memset(st, 0, sizeof(*st));
st->top = -1;
long long inorder = (long long)INT_MIN - 1;
while (st->top != -1 || node != NULL) {
while (node != NULL) {
st->array[++st->top] = node;
node = node->left;
}
node = st->array[st->top--];
if (node->val <= inorder) {
return false;
}
inorder = node->val;
node = node->right;
}
return true;
}