diff --git a/098_validate_binary_search_tree/Makefile b/098_validate_binary_search_tree/Makefile new file mode 100644 index 0000000..72cc896 --- /dev/null +++ b/098_validate_binary_search_tree/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test valid_bst.c diff --git a/098_validate_binary_search_tree/valid_bst.c b/098_validate_binary_search_tree/valid_bst.c new file mode 100644 index 0000000..f112d5b --- /dev/null +++ b/098_validate_binary_search_tree/valid_bst.c @@ -0,0 +1,55 @@ +#include +#include +#include + +struct TreeNode { + int val; + struct TreeNode *left; + struct TreeNode *right; +}; + +static int last_val = -1; + +static bool traverse(struct TreeNode* node) +{ + bool ret = true; + + if (ret && node->left != NULL) { + ret = traverse(node->left); + } + + if (last_val != -1 && node->val <= last_val) { + return false; + } + last_val = node->val; + + if (ret && node->right != NULL) { + ret = traverse(node->right); + } + return ret; +} + +static bool isValidBST(struct TreeNode* root) +{ + if (root == NULL) return true; + last_val = -1; + return traverse(root); +} + +int main(int argc, char **argv) +{ + struct TreeNode root; + struct TreeNode left; + struct TreeNode right; + root.val = 2; + root.left = &left; + root.right = &right; + left.val = 1; + left.left = NULL; + left.right = NULL; + right.val = 3; + right.left = NULL; + right.right = NULL; + printf("%s\n", isValidBST(&root) ? "true" : "false"); + return 0; +} diff --git a/099_recover_binary_search_tree/Makefile b/099_recover_binary_search_tree/Makefile new file mode 100644 index 0000000..95d5434 --- /dev/null +++ b/099_recover_binary_search_tree/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test recover_bst.c diff --git a/099_recover_binary_search_tree/recover_bst.c b/099_recover_binary_search_tree/recover_bst.c new file mode 100644 index 0000000..ecae963 --- /dev/null +++ b/099_recover_binary_search_tree/recover_bst.c @@ -0,0 +1,70 @@ +#include +#include +#include + +struct TreeNode { + int val; + struct TreeNode *left; + struct TreeNode *right; +}; + +static struct TreeNode *last = NULL; +static struct TreeNode *m1 = NULL; +static struct TreeNode *m2 = NULL; +static int wrong = 0; + +static void traverse(struct TreeNode* node) +{ + if (node->left != NULL) { + traverse(node->left); + } + + if (last != NULL && node->val < last->val) { + if (++wrong == 2) { + int tmp = node->val; + node->val = m1->val; + m1->val = tmp; + } + m1 = last; + m2 = node; + } + last = node; + + if (node->right != NULL) { + traverse(node->right); + } +} + +static void recoverTree(struct TreeNode* root) { + if (root != NULL) { + last = NULL; + m1 = NULL; + m2 = NULL; + wrong = 0; + traverse(root); + if (wrong == 1) { + int tmp = m1->val; + m1->val = m2->val; + m2->val = tmp; + } + } +} + +int main(int argc, char **argv) +{ + struct TreeNode root; + struct TreeNode left; + struct TreeNode right; + root.val = 2; + root.left = &left; + root.right = &right; + left.val = 3; + left.left = NULL; + left.right = NULL; + right.val = 1; + right.left = NULL; + right.right = NULL; + recoverTree(&root); + printf("%d %d %d\n", root.val, left.val, right.val); + return 0; +}