当前位置:   article > 正文

leetcode-初级-验证二叉搜索树_java 验证二叉搜索树 leetcode

java 验证二叉搜索树 leetcode

题意:判断一棵树是否满足二叉搜索树。 
二叉搜索树的特点:左子树<根节点<右子树 
解题思路:中序遍历,链栈,来实现。 
对于一颗二叉树,中序遍历的结果若满足递增排序就满足二叉搜索树的条件

引用自:https://blog.csdn.net/sanmao0816/article/details/45085321

  1. /**
  2. *解题思路:中序遍历,链栈
  3. * Definition for binary tree
  4. * struct TreeNode {
  5. * int val;
  6. * struct TreeNode *left;
  7. * struct TreeNode *right;
  8. * };
  9. */
  10. int flag;
  11. struct Node{//创建一个链栈节点
  12. int val;
  13. struct Node *next;
  14. };
  15. struct Stack{//创建一个链栈
  16. struct Node *top;//指向链栈栈顶节点
  17. int count;//记录链栈的节点个数
  18. };
  19. void InitStack(struct Stack *stack){//初始化一个空栈
  20. stack->count = 0;
  21. stack->top = NULL;
  22. }
  23. void PushStack(struct Stack *stack,int val){//压栈
  24. struct Node *node;
  25. node = (struct Node *)malloc(sizeof(struct Node));
  26. if(stack->count > 0){
  27. if(stack->top->val < val){//若不是第一个进栈的节点,则判断与栈顶节点的值大小,若小于栈顶节点值则说明不是二叉搜索树
  28. node->val = val;
  29. node->next = stack->top;
  30. stack->top = node;
  31. stack->count++;
  32. }else{
  33. flag = -1;//若不是二叉搜索树设置全局标志位flag为-1;
  34. return;
  35. }
  36. }else{//第一个值进栈
  37. node->val = val;
  38. node->next = stack->top;
  39. stack->top = node;
  40. stack->count++;
  41. }
  42. }
  43. void Inorder(struct TreeNode *root,struct Stack *stack){//中序遍历
  44. if(root == NULL){
  45. return;
  46. }
  47. Inorder(root->left,stack);
  48. PushStack(stack,root->val);
  49. Inorder(root->right,stack);
  50. }
  51. bool isValidBST(struct TreeNode *root) {
  52. flag = 0;
  53. struct Stack *stack;
  54. stack = (struct Stack *)malloc(sizeof(struct Stack));
  55. InitStack(stack);
  56. Inorder(root,stack);
  57. if(flag == -1){
  58. return 0;
  59. }
  60. return 1;
  61. }

还是比较麻烦的,答案中有简单的,引用自:

https://leetcode-cn.com/submissions/detail/4298464/

  1. bool isTree(struct TreeNode *node,int min,int max)
  2. {
  3. if (node == NULL) return true;
  4. if (node->val < min || node->val > max) return false; //超出目前子树所在范围,不算做树
  5. if (node->left != NULL && node->val == INT_MIN) return false;//有左子树但本身最小,不算
  6. if (node->right != NULL && node->val == INT_MAX) return false;//有右子树但本身最大,不算
  7. return isTree(node->left, min, node->val - 1) && isTree(node->right, node->val + 1, max); //如果目前正常,去分别搜索他的左右子树,更新子树范围,作者很皮很牛逼
  8. }
  9. bool isValidBST(struct TreeNode* root) {
  10. if (!root) //如果是空树,是二叉搜索树
  11. return true;
  12. if(root->left==NULL && root->right ==NULL) //如果是单元素,是二叉搜索树
  13. return true;
  14. return isTree(root, INT_MIN, INT_MAX); //否则,正常判断
  15. }

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号