首页 > 其他分享 >力扣热题100 - 二叉树:验证二叉搜索树

力扣热题100 - 二叉树:验证二叉搜索树

时间:2024-09-15 20:53:19浏览次数:3  
标签:right TreeNode val 力扣 二叉树 100 root stack left

题目描述:

题号:98

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。

  • 节点的右子树只包含 大于 当前节点的数。

  • 所有左子树和右子树自身必须也是二叉搜索树。

图片


解题思路:

思路一:递归

递归规律:

如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;


若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也为二叉搜索树。

时间复杂度:O(N)

空间复杂度:O(N)

C++

// 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 {
    bool check(TreeNode* root, long long int leftSamller, long long int rightBigger) {
        if(root == nullptr) {
            return true;
        }
        if(root->val <= leftSamller || root->val >= rightBigger) {
            return false;
        }
        return check(root->left, leftSamller, root->val) && check(root->right, root->val, rightBigger);
    }
public:
    bool isValidBST(TreeNode* root) {
        return check(root, LONG_MIN, LONG_MAX);
    }
};

go


// go
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isValidBST(root *TreeNode) bool {
    return check(root, math.MinInt64, math.MaxInt64)
}

func check(root *TreeNode, small, big int) bool {
    if root == nil {
        return true
    }
    if root.Val <= small || root.Val >= big {
        return false
    }
    return check(root.Left, small, root.Val) && check(root.Right, root.Val, big)
}

思路二:中序遍历

根据二叉搜索树的性质:它的中序遍历的值一定是递增的

时间复杂度:O(N)

空间复杂度:O(N) 

C++


// 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 isValidBST(TreeNode* root) {
        stack<TreeNode*> stack;
        long long int inorder = (long long int)INT_MIN - 1;

        while (stack.empty() == false || root != nullptr) {
            while (root != nullptr) {
                stack.push(root);
                root = root->left;
            }
            root = stack.top();
            stack.pop();
            // 如果中序遍历不是递增,则不是二叉搜索树
            if (root->val <= inorder) {
                return false;
            }
            inorder = root->val;
            root = root->right;
        }
        return true;
    }
};

go

// go
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isValidBST(root *TreeNode) bool {
    stack := []*TreeNode{}
    inorder := math.MinInt64
    for len(stack) > 0 || root != nil {
        for root != nil {
            stack = append(stack, root)
            root = root.Left
        }
        root = stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        // 如果中序遍历不是递增,则不是二叉搜索树
        if root.Val <= inorder {
            return false
        }
        inorder = root.Val
        root = root.Right
    }
    return true
}

标签:right,TreeNode,val,力扣,二叉树,100,root,stack,left
From: https://blog.csdn.net/H_P10/article/details/142288751

相关文章

  • COMM 1100 Foundations of Communication
    COMM1100(A11)FOUNDATIONSOFCOMMUNICATIONSTUDIESFall2024COURSEDESCRIPTIONThiscourseoffersacomprehensiveoverviewofwhatitmeanstostudycommunications.Studentswillexploreclassicdefinitionsandmodelsofcommunicationsandtracehowth......
  • LeetCode_0144. 二叉树前序遍历 & LeetCode_0096. 二叉树中序遍历 & LeetCode_0145.
    题目描述  给你二叉树的根节点root,返回它节点值的前序/中序/后序遍历。递归写法LeetCode_0144.前序中左右voidmyPreorder(TreeNode*root,vector<int>&ans){if(!root){return;}ans.emplace_back(root->val);myPre......
  • 二叉树的所有路径(所有从根节点到叶子节点的路径)-257
    题目描述给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。解题思路这道题我们采用二叉树里的前序遍历方式,我们要遍历所有到叶子节点的路径,我们采用复用的思想,就是让这里的几个数据结构我们可以重复使用,但是重复使......
  • 力扣最热一百题——螺旋矩阵
    目录题目链接:54.螺旋矩阵-力扣(LeetCode)题目描述示例提示:解法一:模拟1.边界初始化2.循环遍历矩阵3.从左到右遍历上边界4.从上到下遍历右边界5.从右到左遍历下边界6.从下到上遍历左边界7.结束条件代码执行流程总结Java写法:运行时间以及内存消耗C++写法......
  • C++: 二叉树进阶面试题
    做每件事之前都心存诚意,就会事半功倍.目录前言1.根据二叉树创建字符串2.二叉树的层序遍历Ⅰ3.二叉树的层序遍历Ⅱ4.二叉树的最近公共祖先5.二叉搜索树与双向链表6.根据一棵树的前序遍历与中序遍历构造二叉树7.根据一棵树的中序遍历与后序遍历构造二叉树8.二......
  • 二叉树的 Morris 中序遍历
    回顾问题陈述:给定一棵二叉树,实现中序遍历并返回包含其中序序列的数组例如给定下列二叉树:我们按照左、根、右的顺序递归遍历二叉树,得到以下遍历:最终中序遍历结果可以输出为:[3,1,9,2,4,7,5,8,6]MorristrickMorris中序遍历是一种树遍历算法,旨在实现O(1)的空间......
  • [1008]基于JAVA的外卖数据智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的外卖数据智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景与意义:在当今社会,随着互联网技术的快速发展以及生活节奏的加快,外卖行业已逐渐成为现代人生活中不可或缺的一部分。基于Java的外卖数据智慧......
  • 【二叉树的最大深度】带你理解递归奥妙!
    ......
  • 洛谷P1004
    题目传送门:传送门p1004题目背景NOIP2000提高组T4题目描述设有 N×NN×N 的方格图 (N≤9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 00。如下图所示(见样例):某人从图的左上角的 AA 点出发,可以向下行走,也可以向右走,直到到达右下角的 BB ......
  • 洛谷P1006
    题目传送门:传送门p1006题目描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排坐成一个 mm 行 nn 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要......