当前位置: 首页 > news >正文

网站开发协议百度网站图文列表

网站开发协议百度,网站图文列表,wordpress怎么导入demo文件夹,做试用的网站题目描述 实现一个函数,检查一棵二叉树是否为二叉搜索树。 示例 1: 输入: 2/ \1 3输出: true 示例 2: 输入: 5/ \1 4/ \3 6输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。 解题思路与代码 使用…

题目描述

实现一个函数,检查一棵二叉树是否为二叉搜索树。

示例 1:
输入:

    2/ \1   3

输出: true

示例 2:
输入:

    5/ \1   4/ \3   6

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

解题思路与代码

使用额外数据结构 + 中序遍历

这应该是最简单,并且最容易理解的一种做法了。
由二叉搜索树的性质可知,二叉搜索树的左边节点小于中间节点,中间节点小于右边节点。由这一特性我们可以得知,二叉搜索树的中序遍历是一个有序的数组。

我们只需要检查这个数组是否有序,就能判断出这个二叉树是否是二叉搜索树。

具体实现请看代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool isValidBST(TreeNode* root) {vector<int> result;inorderTraversal(root,result);int size = result.size();for(int i = 1; i < size; ++i )if(result[i-1] >= result[i]) return false;return true;}void inorderTraversal(TreeNode* root,vector<int>& vec){if(root == nullptr) return ;inorderTraversal(root->left,vec);vec.push_back(root->val);inorderTraversal(root->right,vec);}
};

在这里插入图片描述

复杂度分析

时间复杂度:O(n),n是这个二叉树的节点数目。我们要遍历这个二叉树的每一个节点。
空间复杂度:O(n),n是这个二叉树的节点数目,我们要将n个元素压入vector中。此外,函数的递归调用会使用一定的系统栈空间,但是由于递归深度不会超过二叉树的高度,所以可以认为空间复杂度也是 O(n) 级别的。

中序遍历不使用额外数据结构

这种做法,就是稍稍的将我刚刚的那种做法升级了一下,我们使用一个前驱指针,去记录中序遍历的前一个节点。那么中序遍历是先遍历左子树然后遍历中间节点,再去遍历右子树的。所以我们只需要一直去判断,这个前驱指针的值是否一种小于中间节点的值就行了。

具体实现请看代码:

class Solution {
public:TreeNode* pre = nullptr;bool isValidBST(TreeNode* root) {if(root == nullptr) return true;if(!isValidBST(root->left)) return false;if(pre != nullptr && pre->val >= root->val) return false;pre = root;if(!isValidBST(root->right)) return false;return true;}
};

注意:这个代码中不太容易想出来的代码在于这一行:if(!isValidBST(root->left)) return false; 我们的递归逻辑是在这个if判断里面的。这个递归就会把我们一直带到左叶子节点。然后再逐层的返回判断。
在这里插入图片描述

复杂度分析:

时间复杂度:O(n),n为节点的个数。不管怎样我们都要遍历这个树中的所有节点。
空间复杂度:O(h),其中 h 是二叉树的高度。最坏情况下(即二叉树退化为链表时),递归调用深度达到 n,此时栈的空间复杂度为 O(n);平均情况下树的高度是 log n,空间复杂度是 O(log n)。

这个代码优化了空间复杂度,因为没有用到额外的数据结构。但是执行代码所需要的时间缺增加了。这是因为我们每次递归都要做许多的判断。而上一次的代码只需要在for循环里做少量判断就行了。

总结

这道题不算太难。只要能及时的想起二叉搜索树的性质,就能轻松解题。

http://www.yayakq.cn/news/132345/

相关文章:

  • 网站首页title假网站备案
  • dede网站模板wordpress 多栏主题
  • 辽宁建设工程质量监督站网站哪个网站可以接广告做
  • 网站开发工程师的经验网站设计素材网站有哪些
  • 关键词搜索引擎网站服务器证书与网站不符
  • 网上拿货做哪个网站好电商怎么入门
  • 网站建设甲方原因造成停工襄阳seo费用
  • 天津网站定制公司凡科可以建设多个网站吗
  • 葫芦岛做网站的公司wordpress免费创建博客
  • 个人如何建立免费网站九江市住房和城乡建设局网站
  • 智慧团建网站怎么转团关系毕设做网站可以用模板吗
  • 网站排名优化方法讲解响应式潍坊网站建设
  • 仿站仿淘宝客网站视频教程广州网络推广有限公司
  • 如何快速自己做网站上海到北京高铁最快2个小时
  • 南昌集团制作网站开发html5可以做交互网站吗
  • 福建移动网站设计服装定制营销
  • 西安企业网站建设哪家好wordpress模板可以添加注册会员
  • php网站 源码官方网站建设专业公司
  • 建设合同网上备案上哪个网站四川九江龙钢结构网架公司
  • 华为公司网站建设分析评价泉州建站服务
  • 网站营销方法有哪些内容制作网页需要的技术
  • 北京网站制作公司兴田德润实惠中国商业企业网
  • 建设 春风 摩托车官方网站医美技术支持东莞网站建设
  • 与网站建设关系密切的知识点网站设计岗位的职责与要求
  • 建模网站广告投放系统源码
  • 网站建设方案书一定要有吗太原市城乡建设局网站
  • 阿里云虚拟主机可以做几个网站吗联系深圳网站制作公司
  • 贷款织梦网站模版政务网站建设交流发言
  • 平台网站建设所需资质做影视网站
  • 网站推广方式推荐wordpress 安卓 源码分析