题意:

image.png

解题思路:

  1. 思路:[递归+中序遍历]
  2. 1. 中序遍历后,检查是否严格上升。
  3. 2. 如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;
  4. 3. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也为二叉搜索树。
  5. 时间复杂度 : O(n)其中n 为二叉树的节点个数。在递归调用的时候二叉树的每个节点最多被访问一次;

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param TreeNode $root
  4. * @return Boolean
  5. */
  6. function isValidBST($root) {
  7. return $this->helper($root);
  8. return $this->isV($root);
  9. return $this->vaild($root, null, null);
  10. }
  11. function helper($root) {
  12. $res = [];
  13. $this->task($root, $res);
  14. for ($i = 0; $i < count($res) - 1; $i++) {
  15. if ($res[$i] >= $res[$i + 1]) return false;
  16. }
  17. return true;
  18. }
  19. function task($node, &$res) {
  20. if ($node == null) return $res;
  21. $this->task($node->left, $res);
  22. $res[] = $node->val;
  23. $this->task($node->right, $res);
  24. }
  25. function vaild($root, $min, $max) {
  26. if (!$root) return true;
  27. if (!is_null($min) && $root->val <= $min) return false;
  28. if (!is_null($max) && $root->val >= $max) return false;
  29. return $this->vaild($root->left, $min, $root->val) && $this->vaild($root->right, $root->val, $max);
  30. }
  31. function isV($root) {
  32. if ($root == null) return true;
  33. //根节点为空且根节点大于左子树的最大值
  34. $leftVaild = $root->left == null || $root->val > $this->max($root->left)->val;
  35. //根节点为空且根节点小于左子树的最小值
  36. $rightVaild = $root->right == null || $root->val < $this->min($root->right)->val;
  37. return $leftVaild && $rightVaild && $this->isV($root->left) && $this->isV($root->right);
  38. }
  39. function min($root) {
  40. while ($root->left != null) {
  41. $root = $root->left;
  42. }
  43. return $root;
  44. }
  45. function max($root) {
  46. while ($root->right != null) {
  47. $root = $root->right;
  48. }
  49. return $root;
  50. }
  51. }

GO代码实现:

  1. /**
  2. * Definition for a binary tree node.
  3. * type TreeNode struct {
  4. * Val int
  5. * Left *TreeNode
  6. * Right *TreeNode
  7. * }
  8. */
  9. func isValidBST(root *TreeNode) bool {
  10. nodes := make([]*TreeNode, 0)
  11. inOrder(root, &nodes)
  12. for i := 0;i < len(nodes) - 1;i++ {
  13. if nodes[i].Val >= nodes[i+1].Val {
  14. return false
  15. }
  16. }
  17. return true
  18. }
  19. func inOrder(root *TreeNode,nodes *[]*TreeNode) {
  20. if root == nil {
  21. return
  22. }
  23. inOrder(root.Left,nodes)
  24. *nodes = append(*nodes,root)
  25. inOrder(root.Right,nodes)
  26. }
  1. /**
  2. * Definition for a binary tree node.
  3. * type TreeNode struct {
  4. * Val int
  5. * Left *TreeNode
  6. * Right *TreeNode
  7. * }
  8. */
  9. func isValidBST(root *TreeNode) bool {
  10. return helper(root, math.MinInt64, math.MaxInt64)
  11. }
  12. func helper(root *TreeNode, min int, max int) bool {
  13. if root == nil {
  14. return true
  15. }
  16. if root.Val <= min || root.Val >= max {
  17. return false
  18. }
  19. return helper(root.Left, min, root.Val) && helper(root.Right, root.Val, max)
  20. }