题目:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/
1 3
输出: true
示例 2:
输入:
5
/
1 4
/
3 6
输出: false
解释: 根节点的值为 5 ,但是其右子节点值为 4 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
思路:
使用递归依次判断。
如果是合格的二叉树,中序遍历的结果应该是升序排列的。
Python解法一:
1 # 定义二叉树 2 class TreeNode: 3 def __init__(self, x): # self相当于类的实例 4 self.val = x 5 self.left = None 6 self.right = None 7 8 9 class Solution(object): 10 @staticmethod 11 def is_valid_bst(root: TreeNode): # 由于是静态的,所以不需要self 12 res = [] # 存储遍历结果 13 14 def helper(root_node): # 辅助函数,用以遍历节点 15 if root_node is None: # 空树也是合格的BST 16 return True 17 help(root_node.left) # 递归左子树 18 res.append(root_node.val) # 执行中序遍历 19 help(root_node.right) # 递归遍历右子树 20 helper(root) # 执行辅助函数 21 return res == sorted(set(res)) # 由于可能存在相等的节点,故需要去重后判断
Python解法二:
1 class Solution(object): 2 3 def isValidBST(self, root: TreeNode): 4 if root is None: 5 return True 6 self.res = [] 7 self.helper(root) # 初始化递归函数 8 return self.res == sorted(set(self.res)) 9 10 def helper(self, root_node): 11 if root_node is None: # 递归终止条件不可少 12 return 13 self.helper(root_node.left) 14 self.res.append(root_node.val) 15 self.helper(root_node.right)
C++解法:
1 struct TreeNode { 2 int val; 3 TreeNode *left; 4 TreeNode *right; 5 TreeNode(int x) : val(x), left(NULL), right(NULL) {}; 6 }; 7 8 class Solution { 9 public: 10 bool isValidBST(TreeNode *root) { // 执行中序遍历 11 if (root == NULL) return true; 12 stack<TreeNode*> node; // 使用栈模拟递归时保存的结果 13 vector<int> res; // 存储中序遍历的结果 14 TreeNode *temp_node = root; 15 while (temp_node != NULL || !node.empty()) { 16 while (temp_node) { 17 node.push(temp_node); 18 temp_node = temp_node->left; 19 } 20 TreeNode *pop_node = node.top(); // 不可以直接使用node.pop(),因为pop()不返回元素 21 node.pop(); 22 res.push_back(pop_node->val); 23 temp_node = pop_node->right; 24 } 25 for (int i = 0; i < res.size() - 1; i++) { // 统计vector元素个数用.size(),不能用sizeof() 26 if (res[i] >= res[i + 1]) // 如果结果不是升序,则不是二叉树 27 return false; 28 } 29 return true; 30 } 31 };