iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++如何实现验证二叉搜索树
  • 302
分享到

C++如何实现验证二叉搜索树

2023-06-19 13:06:25 302人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“c++如何实现验证二叉搜索树”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++如何实现验证二叉搜索树”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。验证二叉搜索树Example 1:In

本文小编为大家详细介绍“c++如何实现验证二叉搜索树”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++如何实现验证二叉搜索树”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

验证二叉搜索树

Example 1:

Input:
2
/
1   3
Output: true

Example 2:

    5
/
1   4
/
3   6
Output: false
Explanation: The input is: [5,1,4,null,null,3,6]. The root node"s value
is 5 but its right child"s value is 4.

这道验证二叉搜索树有很多种解法,可以利用它本身的性质来做,即左<根<右,也可以通过利用中序遍历结果为有序数列来做,下面我们先来看最简单的一种,就是利用其本身性质来做,初始化时带入系统最大值和最小值,在递归过程中换成它们自己的节点值,用long代替int就是为了包括int的边界条件,代码如下:

C++ 解法一:

// Recursion without inorder traversalclass Solution {public:    bool isValidBST(TreeNode* root) {        return isValidBST(root, LONG_MIN, LONG_MAX);    }    bool isValidBST(TreeNode* root, long mn, long mx) {        if (!root) return true;        if (root->val <= mn || root->val >= mx) return false;        return isValidBST(root->left, mn, root->val) && isValidBST(root->right, root->val, mx);    }};

Java 解法一:

public class Solution {    public boolean isValidBST(TreeNode root) {        if (root == null) return true;        return valid(root, Long.MIN_VALUE, Long.MAX_VALUE);    }    public boolean valid(TreeNode root, long low, long high) {        if (root == null) return true;        if (root.val <= low || root.val >= high) return false;        return valid(root.left, low, root.val) && valid(root.right, root.val, high);    }}

这题实际上简化了难度,因为有的时候题目中的二叉搜索树会定义为左<=根<右,而这道题设定为一般情况左<根<右,那么就可以用中序遍历来做。因为如果不去掉左=根这个条件的话,那么下边两个数用中序遍历无法区分:

   20       20
/          
20           20

它们的中序遍历结果都一样,但是左边的是 BST,右边的不是 BST。去掉等号的条件则相当于去掉了这种限制条件。下面来看使用中序遍历来做,这种方法思路很直接,通过中序遍历将所有的节点值存到一个数组里,然后再来判断这个数组是不是有序的,代码如下:

C++ 解法二:

// Recursionclass Solution {public:    bool isValidBST(TreeNode* root) {        if (!root) return true;        vector<int> vals;        inorder(root, vals);        for (int i = 0; i < vals.size() - 1; ++i) {            if (vals[i] >= vals[i + 1]) return false;        }        return true;    }    void inorder(TreeNode* root, vector<int>& vals) {        if (!root) return;        inorder(root->left, vals);        vals.push_back(root->val);        inorder(root->right, vals);    }};

Java 解法二:

public class Solution {    public boolean isValidBST(TreeNode root) {        List<Integer> list = new ArrayList<Integer>();        inorder(root, list);        for (int i = 0; i < list.size() - 1; ++i) {            if (list.get(i) >= list.get(i + 1)) return false;        }        return true;    }    public void inorder(TreeNode node, List<Integer> list) {        if (node == null) return;        inorder(node.left, list);        list.add(node.val);        inorder(node.right, list);    }}

下面这种解法跟上面那个很类似,都是用递归的中序遍历,但不同之处是不将遍历结果存入一个数组遍历完成再比较,而是每当遍历到一个新节点时和其上一个节点比较,如果不大于上一个节点那么则返回 false,全部遍历完成后返回 true。代码如下:

C++ 解法三:

class Solution {public:    bool isValidBST(TreeNode* root) {        TreeNode *pre = NULL;        return inorder(root, pre);    }    bool inorder(TreeNode* node, TreeNode*& pre) {        if (!node) return true;        bool res = inorder(node->left, pre);        if (!res) return false;        if (pre) {            if (node->val <= pre->val) return false;        }        pre = node;        return inorder(node->right, pre);    }};

当然这道题也可以用非递归来做,需要用到栈,因为中序遍历可以非递归来实现,所以只要在其上面稍加改动便可,代码如下:

C++ 解法四:

class Solution {public:    bool isValidBST(TreeNode* root) {        stack<TreeNode*> s;        TreeNode *p = root, *pre = NULL;        while (p || !s.empty()) {            while (p) {                s.push(p);                p = p->left;            }            p = s.top(); s.pop();            if (pre && p->val <= pre->val) return false;            pre = p;            p = p->right;        }        return true;    }};

Java 解法四:

public class Solution {    public boolean isValidBST(TreeNode root) {        Stack<TreeNode> s = new Stack<TreeNode>();        TreeNode p = root, pre = null;        while (p != null || !s.empty()) {            while (p != null) {                s.push(p);                p = p.left;            }            p = s.pop();            if (pre != null && p.val <= pre.val) return false;            pre = p;            p = p.right;        }        return true;    }}

最后还有一种方法,由于中序遍历还有非递归且无栈的实现方法,称之为 Morris 遍历,可以参考博主之前的博客 Binary Tree Inorder Traversal,这种实现方法虽然写起来比递归版本要复杂的多,但是好处在于是 O(1) 空间复杂度,参见代码如下:

C++ 解法五:

class Solution {public:    bool isValidBST(TreeNode *root) {        if (!root) return true;        TreeNode *cur = root, *pre, *parent = NULL;        bool res = true;        while (cur) {            if (!cur->left) {                if (parent && parent->val >= cur->val) res = false;                parent = cur;                cur = cur->right;            } else {                pre = cur->left;                while (pre->right && pre->right != cur) pre = pre->right;                if (!pre->right) {                    pre->right = cur;                    cur = cur->left;                } else {                    pre->right = NULL;                    if (parent->val >= cur->val) res = false;                    parent = cur;                    cur = cur->right;                }            }        }        return res;    }};

读到这里,这篇“C++如何实现验证二叉搜索树”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++如何实现验证二叉搜索树

本文链接: https://www.lsjlt.com/news/296242.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++如何实现验证二叉搜索树
    本文小编为大家详细介绍“C++如何实现验证二叉搜索树”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++如何实现验证二叉搜索树”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。验证二叉搜索树Example 1:In...
    99+
    2023-06-19
  • C++实现LeetCode(98.验证二叉搜索树)
    [LeetCode] 98. Validate Binary Search Tree 验证二叉搜索树 Given a binary tree, determine if it is ...
    99+
    2022-11-12
  • C++实现验证二叉搜索树代码
    本篇内容主要讲解“C++实现验证二叉搜索树代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++实现验证二叉搜索树代码”吧!验证二叉搜索树Given a binary tree, determ...
    99+
    2023-06-20
  • Python实现二叉搜索树
    二叉搜索树 我们已经知道了在一个集合中获取键值对的两种不同的方法。回忆一下这些集合是如何实现ADT(抽象数据类型)MAP的。我们讨论两种ADT MAP的实现方式,基于列表的二分查找和哈希表。在这一节中,我...
    99+
    2022-06-04
    Python
  • C++二叉搜索树实例分析
    本篇内容介绍了“C++二叉搜索树实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!独一无二的二叉搜索树Given an integer&...
    99+
    2023-06-19
  • C++实现LeetCode(99.复原二叉搜索树)
    [LeetCode] 99. Recover Binary Search Tree 复原二叉搜索树 Two elements of a binary search tree (BST...
    99+
    2022-11-12
  • C++如何实现LeetCode之复原二叉搜索树
    这篇文章给大家分享的是有关C++如何实现LeetCode之复原二叉搜索树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[LeetCode] 99. Recover Binary Search Tree 复原二叉搜...
    99+
    2023-06-20
  • C++二叉搜索树BSTree如何使用
    这篇文章主要介绍“C++二叉搜索树BSTree如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++二叉搜索树BSTree如何使用”文章能帮助大家解决问题。一、概念二叉搜索树又称二叉排序树,它...
    99+
    2023-07-05
  • C++实现LeetCode(173.二叉搜索树迭代器)
    [LeetCode] 173.Binary Search Tree Iterator 二叉搜索树迭代器 Implement an iterator over a binary sea...
    99+
    2022-11-12
  • 【C++】平衡二叉搜索树的模拟实现
    🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。 ...
    99+
    2023-09-11
    c++ 开发语言
  • C++实现LeetCode(96.独一无二的二叉搜索树)
    [LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树 Given n, how many structurally un...
    99+
    2022-11-12
  • C语言实例实现二叉搜索树详解
    目录有些算法题里有了这个概念,因为不知道这是什么蒙圈了很久。 先序遍历: root——>left——>right 中序遍历...
    99+
    2022-11-13
  • 如何利用JavaScript实现二叉搜索树
    计算机科学中最常用和讨论最多的数据结构之一是二叉搜索树。这通常是引入的第一个具有非线性插入算法的数据结构。二叉搜索树类似于双链表,每个节点包含一些数据,以及两个指向其他节点的指针;它...
    99+
    2022-11-12
  • 利用java实现二叉搜索树
    目录二叉搜索树的定义实现一颗二叉搜索树二叉搜索树的定义类二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树的定义 它是一颗二叉树 任一节点的左子树上的所有节...
    99+
    2022-11-12
  • C++数据结构之搜索二叉树的实现
    目录零.前言1.概念2.作用3.迭代实现(1)查找(2)插入(3)删除4.递归实现(1)查找(2)插入(3)删除5.key/value模型的应用(1)对应查找(2)判断出现次数6.总...
    99+
    2022-11-13
  • C++实现LeetCode(95.独一无二的二叉搜索树之二)
    [LeetCode] 95. Unique Binary Search Trees II 独一无二的二叉搜索树之二 Given an integer n, generate...
    99+
    2022-11-12
  • C++使用LeetCode实现独一无二的二叉搜索树
    这篇文章主要介绍C++使用LeetCode实现独一无二的二叉搜索树,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树...
    99+
    2023-06-20
  • 如何通过代码实现二叉搜索树
    本篇内容主要讲解“如何通过代码实现二叉搜索树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过代码实现二叉搜索树”吧!首先,二叉搜索树到底是什么二叉搜索树(...
    99+
    2022-10-19
  • C语言实现二叉搜索树的完整总结
    目录1、 二叉树的构建2、二叉树的遍历前序遍历中序遍历后序遍历层序遍历4、二叉树的高度5、二叉树的删除6、由几种遍历序列还原二叉树 前序序列、中序序列还原二叉树:中序序列、...
    99+
    2022-11-12
  • C++简单实现与分析二叉搜索树流程
    目录二叉搜索树二叉搜索树的重要操作二叉搜索树实现(key模型)二叉搜索树的应用二叉搜索树的实现(key/value模型)二叉搜索树 二叉搜索树又被称为二叉排序树。它可以是一个空树,如...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作