验证二叉搜索树(Python and C++解法)

题目:

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 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 };
posted @ 2020-06-19 17:51  孔子?孟子?小柱子!  阅读(243)  评论(0编辑  收藏  举报