给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 根节点的值为 5 ,但是其右子节点值为 4 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
使用递归依次判断。
如果是合格的二叉树,中序遍历的结果应该是升序排列的。
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): 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)) # 由于可能存在相等的节点,故需要去重后判断
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 };
原文:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13164343.html