LeetCode 98. Validate Binary Search Tree–C++解法–判断是否是BST–递归,迭代做法,中序遍历
LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 大部分题目C++,Python,Java的解法都有。
题目地址:Validate Binary Search Tree - LeetCode
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node’s key. The right subtree of a node contains only nodes with keys greater than the node’s key. Both the left and right subtrees must also be binary search trees.
Example 1:
2 / \ 1 3 Input: [2,1,3] Output: trueExample 2:
5 / \ 1 4 / \ 3 6 Input: [5,1,4,null,null,3,6] Output: false Explanation: The root node's value is 5 but its right child's value is 4.这道题目是判断二叉树是否是搜索二叉树,自然就想到了递归和迭代2种做法。
递归的话在考虑后发现对每个节点都要维护一个最小值和最大值。 C++解法如下:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isValidBST(TreeNode *root) { return isValidBST(root, nullptr, nullptr); } bool isValidBST(TreeNode *root, TreeNode *min, TreeNode *max) { if (!root) return true; if (min != nullptr && root->val <= min->val) return false; if (max != nullptr && root->val >= max->val) return false; return isValidBST(root->left, min, root) && isValidBST(root->right, root, max); } };可以采用中序遍历,看是否有序。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isValidBST(TreeNode* root) { if (root == nullptr) return true; stack<TreeNode*> s; TreeNode* current = root; TreeNode* prev = nullptr; while (current || !s.empty()) { while(current) { s.push(current); current = current->left; } current = s.top(); s.pop(); if (prev && prev->val >= current->val) return false; prev = current; current = current->right; } return true; } };奇怪的是中序遍历花费的时间跟递归做法花费的时间基本一样。