• 验证二叉搜索树(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 };
  • 相关阅读:
    对C#泛型中的new()约束思考
    c语言位运算符
    最简单易懂的委托例子
    静态方法是否属于线程安全
    使用JS实现鼠标滚轮事件
    Google Map 自定义 infowindow
    firefox下对ajax的onreadystatechange的支持情况分析及解决
    xcode7和ios9下UIWebView不能加载网页的解决方法
    在iOS平台使用ffmpeg解码h264视频流(转)
    Mac下批量删除.svn文件
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13164343.html
Copyright © 2020-2023  润新知