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

单位门户网站怎么做seo站长工具平台

单位门户网站怎么做,seo站长工具平台,别墅装修案例,天津做网站首选津坤科技b注意:迭代法,可以先过,二刷有精力的时候 再去掌握迭代法。 110.平衡二叉树 (优先掌握递归) 再一次涉及到,什么是高度,什么是深度,可以巩固一下。 题目:给定一个二叉树&am…
注意:迭代法,可以先过,二刷有精力的时候 再去掌握迭代法。

110.平衡二叉树 (优先掌握递归)

再一次涉及到,什么是高度,什么是深度,可以巩固一下。

题目:给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:给定二叉树 [3,9,20,null,null,15,7]    返回 true 。  示例2:返回false

题外话

咋眼一看这道题目和104.二叉树的最大深度 (opens new window)很像,其实有很大区别。

这里强调一波概念:

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

但leetcode中强调的深度和高度很明显是按照节点来计算的,如图:

注意:关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。

因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中)

有的同学一定疑惑,为什么104.二叉树的最大深度 (opens new window)中求的是二叉树的最大深度,也用的是后序遍历。

那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历。

本题思路:(此时大家应该明白了既然要求比较高度,必然是要后序遍历。)采用递归法

递归三步曲分析:

1.明确递归函数的参数和返回值

参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。

那么如何标记左右子树是否差值大于1呢?

如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。

所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。

2.明确终止条件

递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0

3.明确单层递归的逻辑

如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。

分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

class Solution {public boolean isBalanced(TreeNode root) {//递归法return getHeight(root) != -1;}private int getHeight(TreeNode root){if(root == null ) return 0;int leftHeight = getHeight(root.left);if(leftHeight == -1) return -1;int rightHeight = getHeight(root.right);if(rightHeight == -1) return -1;//左右子树高度差大于1,return -1表示已经不是平衡二叉树了if(Math.abs(leftHeight - rightHeight) > 1)  {return -1;}return Math.max(leftHeight,rightHeight) + 1;}
}

257. 二叉树的所有路径 (优先掌握递归)  

这是大家第一次接触到回溯的过程, 我在视频里重点讲解了 本题为什么要有回溯,已经回溯的过程。 如果对回溯 似懂非懂,没关系, 可以先有个印象。 

题目:给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

思路

这道题目要求从根节点到叶子的路径,所以需要前序遍历这样才方便让父节点指向孩子节点,找到对应的路径。

在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。

前序遍历以及回溯的过程如图:

我们先使用递归的方式,来做前序遍历。 要知道递归和回溯就是一家的,本题也需要回溯。
class Solution {public List<String> binaryTreePaths(TreeNode root) {//递归法List<String> res = new ArrayList<>(); //用于存储最终结果集的List,其中每个元素都是一个表示路径的字符串。if(root == null)  return res;List<Integer> paths = new ArrayList<>();//用于在递归过程中构建路径的List,其中每个元素都是二叉树节点的值。traversal(root,paths,res);return res;}//traversal 方法是递归的核心部分,它接受当前节点、路径列表和结果列表作为参数。private void traversal(TreeNode root,List<Integer> paths,List<String> res){paths.add(root.val); //前序遍历,中!//遇到叶子节点时(左右子树都为空的节点)if(root.left == null && root.right == null){//输出StringBuilder sb = new StringBuilder();//创建一个StringBuilder对象sb用来拼接字符串,速度更快//遍历路径列表,将paths中的元素按顺序连接成一个路径,并将该路径添加到res集合中。for(int i = 0;i < paths.size()-1; i++){ sb.append(paths.get(i)).append("->");}sb.append(paths.get(paths.size() - 1));//记录最后一个节点res.add(sb.toString());//收集一个路径return;}//递归和回溯是同时进行的,所以要放在同一个花括号里if(root.left != null){ traversal(root.left,paths,res); //左paths.remove(paths.size() - 1); //回溯}if(root.right != null){traversal(root.right,paths,res); //右paths.remove(paths.size() - 1); //回溯}}
}

注意:

  • traversal 方法:

    • traversal 方法是递归的核心部分。它接受当前节点、路径列表和结果列表作为参数。
    • 将当前节点的值添加到路径列表中。
    • 如果当前节点是叶子节点(左右子节点都为空),则执行以下操作:
      • 创建一个 StringBuilder 对象 sb
      • 通过遍历路径列表,将节点值连接成路径字符串,并使用 -> 分隔。
      • 将路径字符串添加到结果列表中。
    • 无论当前节点是否为叶子节点,都会递归地对左子节点和右子节点执行相同的操作(如果存在的话)。在递归之后,会通过 paths.remove(paths.size() - 1); 进行回溯,移除刚刚添加的节点值,以恢复到上一层的状态。

这行代码 paths.remove(paths.size() - 1);

是在回溯过程中使用的。在递归遍历左子树或右子树之后,程序需要回到当前节点的父节点,继续遍历其他子节点或者回溯到更上层的节点。

因为 paths 列表记录了从根节点到当前节点的路径,当递归返回到父节点时,需要将当前节点从路径中移除,以便继续探索其他分支或者回溯到更上层的节点,保证 paths 列表中记录的是当前路径上的节点序列。这就是为什么在回溯时,需要移除 paths 列表中的最后一个元素的原因。

class Solution {//方式二:递归法,精简版,并隐藏了回溯过程List<String> result = new ArrayList<>();//用于存储最终结果集的List,其中每个元素都是一个表示路径的字符串。public List<String> binaryTreePaths(TreeNode root) {traversal(root, "");return result;}public void traversal(TreeNode node, String sb) {//当前节点为空时if (node == null)return;//当前节点为 叶子节点时,将当前节点的值添加到字符串s后面,并将整个字符串添加到结果列表中。if (node.left == null && node.right == null) {result.add(new StringBuilder(sb).append(node.val).toString()); //中return;}//创建一个临时字符串 tmp,它是在字符串s后面添加了当前节点的值和箭头 ->。String tmp = new StringBuilder(sb).append(node.val).append("->").toString();  traversal(node.left, tmp);  //左traversal(node.right, tmp); //右}
}
  1. traversal 方法:

    • 如果当前节点为空,直接返回。
    • 如果当前节点是叶子节点(左右子节点都为空),则将当前节点的值添加到字符串 s 后面,并将整个字符串添加到结果列表中。
    • 创建一个临时字符串 tmp,它是在字符串 s 后面添加了当前节点的值和 ->
    • 然后分别对左子节点和右子节点递归调用 traversal 方法,并将临时字符串 tmp 作为参数传递下去。
  2. 总体逻辑:

    • 通过递归调用 traversal 方法,在每个叶子节点处将路径字符串添加到结果列表中。
    • 递归过程中使用临时字符串来构建路径,简化了代码的实现。

这种方法的核心思想与之前的代码类似,都是通过递归遍历二叉树,并在叶子节点处构建路径字符串。但是,这个精简版的代码隐藏了回溯过程,通过临时字符串tmp和直接在叶子节点处添加路径字符串来简化了代码的结构。

404.左叶子之和 (优先掌握递归)

其实本题有点文字游戏,搞清楚什么是左叶子,剩下的就是二叉树的基本操作。 

计算给定二叉树的所有左叶子之和。

思路

首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。

因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

大家思考一下如下图中二叉树,左叶子之和究竟是多少? 没有左叶子!

 再看这个图的左叶子之和是多少?

相信通过这两个图,大家对最左叶子的定义有明确理解了。

那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。

如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下:

if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {左叶子节点处理逻辑
}

递归法

递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。

递归三部曲:

1.确定递归函数的参数和返回值

判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int

使用题目中给出的函数就可以了。

2.确定终止条件

如果遍历到空节点,那么左叶子值一定是0

注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0,那么终止条件为:

if (root == NULL) return 0;
if (root->left == NULL && root->right== NULL) return 0; //其实这个也可以不写,如果不写不影响结果,但就会让递归多进行了一层。

3.确定单层递归的逻辑

当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。

class Solution {public int sumOfLeftLeaves(TreeNode root) {//递归法,后序遍历if(root == null) return 0;int leftValue = sumOfLeftLeaves(root.left); //左int rightValue = sumOfLeftLeaves(root.right); //右int midValue = 0;//判断左叶子的关键语句,该节点的左节点不为空,但左节点的左节点和左节点的右节点为空! //则把该节点的左节点赋值给midValueif(root.left != null && root.left.left == null && root.left.right == null){midValue = root.left.val;}int sum = midValue + leftValue + rightValue; //中return sum;}
}
http://www.dinnco.com/news/85577.html

相关文章:

  • 新服务器做网站如何配置合肥百度推广优化
  • 微网站搭建的步骤和技巧31省市新增疫情最新消息
  • 赛事竞猜网站开发网站推广软件哪个最好
  • dedecms 资源类网站外包seo公司
  • 高埗镇做网站免费友情链接网站
  • 网站制作的重要性免费网站大全
  • 深圳微信网站建设报价搜索引擎优化的报告
  • 中英文微信网站开发营销课程培训视频
  • 嘉兴网站制作公司关键词查找的方法有以下几种
  • 网站建设和网站设计一样吗靠谱的推广平台有哪些
  • 网站的反链要怎么做百度地图在线使用
  • 用内网穿透做网站可以被收录吗霸榜seo
  • 做go分析的网站沧州网站建设优化公司
  • 院校网站建设小红书关键词热度查询
  • 北京正邦网站建设全球十大搜索引擎
  • 室内设计做效果图可以接单的网站什么是百度指数
  • 高端网站定制开发深圳女生学市场营销好吗
  • 凡科怎么建站教程黑龙江网络推广好做吗
  • 阜宁做网站哪家好网络推广外包内容
  • wordpress模板主题介绍惠州seo管理
  • 做网站第一步要学什么百度广告投放公司
  • 网站加载速率谷歌关键词优化怎么做
  • 做手机网站百度网址是多少
  • 什么自己做网站网络服务提供商
  • 平台运营是做什么的网站优化seo
  • 做网站上传服务器吗seo网络优化专员是什么意思
  • 做网站赚不到钱了爱站网综合查询
  • 做五金奖牌进什么网站seo关键词排名注册价格
  • wordpress建手机版6seo网站推广助理
  • 整站排名优化品牌长春百度关键词优化