每日一题 Day5--leetcode98--验证二叉搜索树

每日一题 Day5–leetcode98–验证二叉搜索树

题目

链接:https://leetcode-cn.com/problems/validate-binary-search-tree/

链接为leetcode中文社区,题目没有区别,感觉很好用

题面描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树。

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

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树

示例 1:

输入:
    2
   / \
  1   3
输出: true

示例2:

输入:
    5
   / \
  1   4
     / \
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4

解析+c语言实现

二叉搜索树,特点为所有左子树的节点小于根节点,所有右子树的节点大于根节点,如例子:

    5
   / \
  1   6
     / \
    4   7
输出: false

根节点为5,左节点为1,右节点为6满足条件,再看右子树,根节点为6,左为4,右为7,满足条件,但是!右子树的左节点4小于原树的根节点5,所以不满足条件,输出为false

这个例子可以看出,不仅需要比较最近的左右节点和很节点的大小关系,还需要比较左右子树的其他节点与根节点的关系。

本题很明显是一个递归的题目,即可以用判断根的方法来判断左子树,而在递归的过程中需要传给子树一个范围**(最小值,最大值)**开区间,一旦有数超过这个范围即输出false,不是二叉搜索树

/**
 \* Definition for a binary tree node.
 \* struct TreeNode {
 \*   int val;
 \*   struct TreeNode *left;
 \*   struct TreeNode *right;
 \* };
 */
bool sousuoshu(struct TreeNode * root,long long lower,long long upper)//递归函数
{
  if(root==NULL) return true;//递归结束条件
  if(root->val<=lower||root->val>=upper) return false;//
   return sousuoshu(root->left,lower,root->val)&&sousuoshu(root->right,root->val,upper);//递归判断左右子树是否满足
}
bool isValidBST(struct TreeNode* root){
  return sousuoshu(root,-2147483649,2147483648);//递归从根节点开始
}

执行结果:
每日一题 Day5--leetcode98--验证二叉搜索树_第1张图片
可以分析得到,每个节点都只遍历一次,所以时间复杂度为O(n)

关于每日一题

疫情在家学业不重,又觉得自己算法很薄弱,所以希望可以每天刷一道算法题。

在翻leetcode找题的时候看到了推出的每日1题打卡计划,觉得不错,在此写下来加深记忆,也希望可以帮到其他人

今天只写了c语言实现,最近在学习python和go,在复习java,过几天尝试不同语言实现。

Day5总结:

leetcode98为一道 递归遍历二叉树 问题

如果不出意外,每天这个时间更,欢迎监督,大家共勉。

欢迎关注公众号,日常同步博客内容,每日零点更新,前几天出去玩耽误了一下最近在每日三题补,欢迎监督。
每日一题 Day5--leetcode98--验证二叉搜索树_第2张图片

你可能感兴趣的:(每日一题leetcode,leetcode,算法,c语言,二叉树,递归法)