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

苏州做网站的公司/百度竞价返点开户

苏州做网站的公司,百度竞价返点开户,广州新际网站建设,陕西示范校建设专题网站昨天的文章讲述了二叉树的先序、中序和后序的遍历方法(递归和非递归),但是这种遍历方法有什么意义么?今天来讲讲这些算法可以用来做什么,只要稍加更改,我们就可以得到另外一个功能,只需要仅仅几行代码的修改…

95ad5f23902967d4a32ad3e312dc9076.png

昨天的文章讲述了二叉树的先序、中序和后序的遍历方法(递归和非递归),但是这种遍历方法有什么意义么?今天来讲讲这些算法可以用来做什么,只要稍加更改,我们就可以得到另外一个功能,只需要仅仅几行代码的修改!

二叉树遍历的应用:判断二叉树的类别​mp.weixin.qq.com
f4de5605be389298faad4db4033494be.png

还记得上篇文章二叉树的分类么?今天我们要来说三种树的分类:完全二叉树、平衡二叉树和搜索二叉树!
完全二叉树:只有最后一层不需要铺满,其余各层均是满的状态!
平衡二叉树:每个节点的左子树和右子树的高度不能超过1,也就是小于等于1
搜索二叉树:按照中序遍历必定会得到一个有序的数组,也就是当前节点的值要大于左孩子的值,小于右孩子的值。
我们以下面的二叉树为例,其均符合以上的三个类别!

835acbf5bfe0464fa72896d91c2a2d51.png

判断二叉树的类别

是否为平衡二叉树

这里面就存在一个套路,因为判断是否为平衡二叉树的规则对于每个节点都是一致的,也就是说当前节点左子树的高度和其右子树的高度高度差不能超过1,这就很显然可以使用一个递归函数来对每个节点进行遍历,并判断!对于这个递归函数而言,其输入参数应该为当前树的根节点(子树头结点),而返回值为当前树的高度(int)以及是否为平衡树(bool)。对于整棵树而言,只要任意一个子树不为平衡二叉树,那么整个数也不会为平衡二叉树。
由于C++中一个函数不能像Python那样返回多个变量,所以我们将其返回值设计成一个类(很好的思路)!

class 

是否为完全二叉树(层次遍历)

由于完全二叉树是主要判断最后一层的节点是否在最左侧以及各层是否填满,我们很容意想到层次遍历的方法,我们使用一个队列来缓冲层次遍历的节点!然后在层次遍历的同时对节点进行判断,规则如下:

  1. 如果当前节点的右孩子节点不为空,而左孩子节点为空,直接判断false。
  2. 如果当前节点的左右孩子节点如果有一个为空,我们标记leaf=True,也就是往后遍历的节点的孩子节点必须都为空,否则返回false。

逻辑就是这个样子,我们来看代码:

// 如何判断一棵树为完全二叉树(层次遍历的方法)
bool isCBT(TreeNode* head){if (head == nullptr){return true;}queue<TreeNode*>* que = new queue<TreeNode*>;bool leaf = false;TreeNode* l = nullptr;TreeNode* r = nullptr;TreeNode* cur = head;que->push(cur);while(!que->empty()){cur = que->front();que->pop();if (leaf && (cur->left != nullptr || cur->right != nullptr)  
// 如果一个节点右为非空而左为空,那么返回false|| (cur->right != nullptr && cur->left == nullptr)){     
// 如果到达叶节点,那么剩余节点必为叶节点return false;}if (cur->left != nullptr){que->push(cur->left);}if (cur->right != nullptr){que->push(cur->right);}if (cur->left == nullptr || cur->right == nullptr){leaf = true;}}return true;
}

判断是否为搜索二叉树(中序遍历)

搜索二叉树有一个很重要的性质:中序遍历后为一个有序数组,当我们知道这个性质后,我们只需将中序遍历的代码改下就好了,由于我们使用中序遍历可以得到每一个节点,然后当前节点的值和前一个节点的值进行比较,如果大于,那么继续遍历,否则我们返回false!(搜索二叉树不允许重复的数值存在)如果可以成功遍历每个节点,并都满足那个比较条件,那么返回true。
当然这样的话,由于使用了堆栈结构,会有额外的空间复杂度,还有一个Morris算法,可以使用O(1)的空间进行中序遍历,我们以后再说!

// 判断一个二叉树是否为搜索二叉树(中序遍历为一个有序数组) 中序遍历方法
bool isBST_InOrder(TreeNode* head){if(head == nullptr){return true;}cout << "In Order:" << endl;stack<TreeNode*>* sta = new stack<TreeNode*>;TreeNode* cur = head;int min = INT16_MIN;while(!sta->empty() || cur != nullptr){if (cur != nullptr){sta->push(cur);cur = cur->left;}else{cur = sta->top();sta->pop();cout << cur->value << " ";if ((cur->value - min) > 0){min = cur->value;}else{return false;}cur = cur->right;}}cout << endl;return true;
}

资源链接

完整测试文件(C++版),文件名为:判断一棵树是否为BBT、BST和CBT。请关注我的个人公众号 (算法工程师之路),回复"左神算法基础CPP"即可获得,并实时更新!希望大家多多支持哦~

公众号简介:分享算法工程师必备技能,谈谈那些有深度有意思的算法,主要范围:C++数据结构与算法/深度学习(CV),立志成为Offer收割机!坚持分享算法题目和解题思路(Day By Day)

11fddbd407984d320af64a4617d876b9.png
http://www.lbrq.cn/news/2340613.html

相关文章:

  • 医院导航网站怎么做/百度搜索一下
  • 培训网站建设/怎么制作网页里面的内容
  • 网站301跳转怎么做/百度收录推广
  • 试百客 专业做试用的网站/网络推广怎么推广
  • 一级消防工程师考试通过率多少/百度seo详解
  • 企业网站建设中存在的主要问题会有哪些?/免费公司网站建站
  • 电子商务网站设计内容/互联网营销主要学什么
  • 网站建设 技术方案/广东省广州市白云区
  • 新网站应该怎么做seo/域名注册商怎么查
  • 重庆公司网站制作公司/地推网app推广平台
  • wordpress5.0大更新/seo网络贸易网站推广
  • 贵州省住房和城乡建设厅门户网站/旺道seo软件
  • 中华智能自建代理网站/微信广告怎么投放
  • 专业的网站制作公司哪家好/seo优化运营专员
  • 工信部网站备案平台/第一设计
  • 北京网站建设价格/单页应用seo如何解决
  • 多商户系统/福州百度首页优化
  • java用什么软件编写/电商seo优化
  • html5电影网站源码php/安徽网站seo公司
  • 常用的网页编辑软件有哪些/福州短视频seo公司
  • 做外国语上门按摩服务网站/外贸seo网站
  • 微网站开发难度/个人网页怎么制作
  • 购物网站开发毕业论文/seo站内优化公司
  • 长春个人做网站/seo赚钱方法大揭秘
  • 招聘网站建设的项目描述/百度推广售后电话
  • 中国建设银行官网站住房公积金/百度账号购买1元40个
  • 聊城做网站哪里好/武汉seo诊断
  • 优秀的店面空间设计网站/数据分析培训机构哪家好
  • 南阳网站建设南阳/数据分析网页
  • 基于cms的企业网站建设/百度竞价排名的利与弊
  • 单臂路由实现VLAN互通实验
  • HTTP常见误区
  • 【Python3-Django】快速掌握DRF:ModelViewSet实战指南
  • 常用的OTP语音芯片有哪些?
  • 代码随想录算法训练营第十七天
  • 为什么玩游戏用UDP,看网页用TCP?