首页 > 其他分享 >力扣---验证二叉搜索树---前根/中根/后根遍历

力扣---验证二叉搜索树---前根/中根/后根遍历

时间:2024-03-18 17:32:04浏览次数:20  
标签:力扣 right TreeNode val root --- return 中根 left

 题目解析参考:验证二叉搜索树_哔哩哔哩_bilibili

一开始做呢,就跟这位老兄一样:

因为没有考虑到5和3的比较

接下来走入整体:

先根遍历解法:

首先 每个点其实都有范围,比如根节点的范围在(-INF,INF),就拿上面图片举例子,4这个节点的范围应该是(-INF,5),所以先序遍历,我们要先比较根节点是否在他应该在的范围,其次判断左子树,接下来判断右子树。题目中的数据比较有趣,建议大家用LONG_MIN和LONG_MAX来定义-INF和INF。推荐博客:宏LONG_MAX和LLONG_MAX-CSDN博客

代码:

C++:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    bool dfs(TreeNode* root,long int left,long int right){
        if(root==nullptr){return true;}
        if(root->val<=left || root->val>=right){return false;}
        if(dfs(root->left,left,root->val)==false){return false;}
        if(dfs(root->right,root->val,right)==false){return false;}
        return true;
    }
    bool isValidBST(TreeNode* root) { 
        return dfs(root,LONG_MIN,LONG_MAX);
    }
};

Python:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        def dfs(root:Optional[TreeNode],left:int,right:int) -> bool:
            if root is None:
                return True
            if root.val<=left or root.val>=right:
                return False
            if dfs(root.left,left,root.val)==False:
                return False
            if dfs(root.right,root.val,right)==False:
                return False
            return True

        return dfs(root,-float('INF'),float('INF'))

需要注意的地方有:

Python中表示正无穷为:

-float('INF'),float('INF')

参考博客为:python 中正无穷,负无穷的表示-CSDN博客

中根遍历解法:

中根遍历二叉搜索树得到的是有序数列,那么我们只需简单的判断上次判断的那个数是否小于正在判断的这个数即可。即先判断左子树,给出判断条件,再判断右子树。

代码:

C++:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    long pre=LONG_MIN;
    bool isValidBST(TreeNode* root) { 
        if(root==nullptr){return true;}
        if(isValidBST(root->left)==false){return false;}
        if(root->val<=pre){return false;}
        pre=root->val;
        if(isValidBST(root->right)==false){return false;}
        return true;
    }
};

Python:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    pre=-float("INF")
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        if root is None:
            return True
        if self.isValidBST(root.left)==False:
            return False
        if root.val<=self.pre:
            return False
        self.pre=root.val
        if self.isValidBST(root.right)==False:
            return False
        return True

注意这行代码,否则会出错:

self.pre=root.val

后根遍历解法:

力扣--二叉树的最近公共祖先-CSDN博客思路类似,都是把下面的左子树和右子树的最小值和最大值向上传,如果根节点的值小于等于左子树的最大值 或者 根节点的值大于等于右子树的最小值,那么这就不是个二叉搜索树(返回-INF,INF,最后判断根节点返回的两个值是不是-INF,INF即可)。那么向上传的值是什么呢,是这个子树的最小值以及最大值,最小值即为左子树的最小值和该节点的值取最小(为什么还要考虑该节点呢?因为有没有左子树的情况,此时左子树的最小值为INF,最大值为-INF),同理最大值即为右子树的最大值和该节点的值取最大。

代码:

C++:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    pair<long,long> dfs(TreeNode* root){
        if(root==nullptr){return {LONG_MAX,LONG_MIN};}
        auto[l_min,l_max]=dfs(root->left);
        auto[r_min,r_max]=dfs(root->right);
        //cout<<l_min<<' '<<l_max<<' '<<r_min<<' '<<r_max<<endl;
        if(root->val<=l_max || root->val>=r_min){return {LONG_MIN,LONG_MAX};}
        return {min(l_min,long(root->val)),max(r_max,long(root->val))};
    }
    bool isValidBST(TreeNode* root) {
        auto[res_l,res_r]=dfs(root);
        if(res_l==LONG_MIN){return false;}
        return true;
    }
};

Python:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        def dfs(root:Optional[TreeNode]) -> Tuple:
            if root is None:
                return float("INF"),-float("INF")
            l_min,l_max=dfs(root.left)
            r_min,r_max=dfs(root.right)
            if root.val<=l_max or root.val>=r_min:
                return -float("INF"),float("INF")
            return min(l_min,root.val),max(r_max,root.val)
        res_l,res_r=dfs(root)
        if res_l==-float("INF"):
            return False
        return True

标签:力扣,right,TreeNode,val,root,---,return,中根,left
From: https://blog.csdn.net/sweet_Mary/article/details/136809570

相关文章

  • 【Linux】基础 IO(文件系统 & inode & 软硬链接)-- 详解
    一、理解文件系统1、前言我们一直都在说打开的文件,磁盘中包含了上百万个文件,肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件,下面重点谈谈未打开的文件。我们知道打开的文件是通过操作系统被进程打开,一旦打开,操作系统就要维护多个文件,所以它......
  • 【PostgreSQL PGCE-091题目解析14】PostgreSQL中使用CONCURRENTLY选项创建索引时,允许
    本文为云贝教育刘峰(微信:yunbee_DBA)原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。PostgreSQL中使用CONCURRENTLY选项创建索引时,允许增删改数据表。A.正确B.错误参考答案:A解析:我们知道,PG是有行级琐的,在创建索引的时候,会在行上加琐......
  • uniapp微信小程序随机生成canvas-id报错?
    uniapp微信小程序随机生成canvas-id报错?文章目录uniapp微信小程序随机生成canvas-id报错?效果图遇到问题解决场景:子组件,在mounted绘制canvas;App、H5端正常显示,微信小程序报错;效果图遇到问题随机生成canvas-id方式,控制台报错【:canvas-idattributeisun......
  • 随笔-Unity中的ScrollView如何跳转到指定的Item位置
         在我们平时开发滑动列表的UI时,虽然UGUI的ScrollView并不是很好用,但是有时一些非常简单的列表我们没有必要加入一些很复杂的列表插件,用简单的ScrollView就可以完成我们的需求。    我们可以通过计算列表中有多少个Item,再利用ScrollView中Content的长度来......
  • 杭电OJ 2072-单词数
    单词数因为新学了散列表容器map,这道题只用统计不同单词的总数,用映射再统计个数蛮合适,学以致用doge,需要注意文章开头可能有空格,最后要把空格这一映射减掉。AC代码:#include<iostream>#include<cstdio>#include<map>#include<string>usingnamespacestd;map<string,......
  • vue element-ui prop 同时校验两个输入框都不能为空
    <el-row><el-col:span="24"><el-form-itemlabel="故障阈值:"class="a_row":prop="addForm.thresholdFaultMin.length==0?'thresholdFaultMin':'thresholdFaultMax&#......
  • STM32工具使用--J-Flash烧录程序
            最近客户那边需要给他们烧程序,他们需要把板子给寄给我,我烧写好之后又发回去,这样一来一回就浪费不少时间,而且也比较麻烦,所以最近给它们出了一个如何烧写.hex程序文件的步骤,这样以后就不用再麻烦自己给他们烧写了,他们根据教程就能完成。    我使用的是P......
  • java数据结构与算法刷题-----LeetCode45. 跳跃游戏 II
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录解题思路:时间复杂度O(n......
  • java数据结构与算法刷题-----LeetCode55. 跳跃游戏
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录解题思路:时间复杂度O(n......
  • ***python看图软件***(+-切换文件夹,d删除所在文件夹)
    importosimporttkinterastkfromtkinterimportsimpledialog,messageboxfromPILimportImage,ImageTkclassImageViewer(tk.Tk):def__init__(self):super().__init__()#初始化变量self.all_images=[]self.current_f......