Leetcode二叉树刷题(一)

embedded/2024/9/23 6:30:37/

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true
 public boolean isSymmetric(TreeNode root) {if(root==null)return true;return compare(root.left,root.right);}public boolean compare(TreeNode left,TreeNode right){if(left==null&&right==null)return true;else if(left==null&&right!=null)return false;else if(left!=null&&right==null)return false;else if(left!=null&&right!=null&&left.val!=right.val)return false;elsereturn compare(left.left,right.right)&&compare(left.right,right.left);}

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
 public boolean hasPathSum(TreeNode root, int targetSum) {if(root==null)return false;if(root.left==null&&root.right==null){return targetSum-root.val==0;}targetSum=targetSum-root.val;return hasPathSum(root.left,targetSum)||hasPathSum(root.right,targetSum);}

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。

计算从根节点到叶节点生成的 所有数字之和 。

叶节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25
  public int sumNumbers(TreeNode root) {if (root == null) {return 0;}return dfs(root, 0);}public int dfs(TreeNode root, int prevSum) {int sum = prevSum * 10 + root.val;if (root.left == null && root.right == null) {return sum;} else {return dfs(root.left, sum) + dfs(root.right, sum);}}

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
 public TreeNode buildTree(int[] inorder, int[] postorder) {if(postorder.length==0)return null;TreeNode root=new TreeNode();root.val=postorder[postorder.length-1];if(postorder.length==1)return root;int index=0;for(index=0;index<inorder.length;index++){if(inorder[index]==postorder[postorder.length-1])break;}int[] inorder_pre = Arrays.copyOfRange(inorder, 0, index);int[] inorder_back = Arrays.copyOfRange(inorder, index+1, inorder.length);int[] postorder_pre = Arrays.copyOfRange(postorder, 0, inorder_pre.length);int[] postorder_back = Arrays.copyOfRange(postorder, inorder_pre.length, inorder_pre.length+inorder_back.length);root.left=buildTree(inorder_pre,postorder_pre);root.right=buildTree(inorder_back,postorder_back);return root;}

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树 

示例 1:

输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。- 空数组,无子节点。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。- 空数组,无子节点。- 只有一个元素,所以子节点是一个值为 1 的节点。- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。- 只有一个元素,所以子节点是一个值为 0 的节点。- 空数组,无子节点。
public TreeNode constructMaximumBinaryTree(int[] nums) {if(nums.length==0)return null;//stream流求数组最大值的索引int asInt = IntStream.range(0, nums.length).reduce((i, j) -> nums[i] > nums[j] ? i : j).getAsInt();TreeNode node=new TreeNode();node.val=nums[asInt];int[] left = Arrays.copyOfRange(nums, 0, asInt);int[] right = Arrays.copyOfRange(nums, asInt + 1, nums.length);node.left=constructMaximumBinaryTree(left);node.right=constructMaximumBinaryTree(right);return node;}

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

示例 1:

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]
 public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if (root1 == null) return root2;if (root2 == null) return root1;root1.val += root2.val;root1.left = mergeTrees(root1.left,root2.left);root1.right = mergeTrees(root1.right,root2.right);return root1;}

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

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

  • 节点的左

    子树

    只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true
  TreeNode pre;public boolean isValidBST(TreeNode root) {if(root==null)return true;boolean left = isValidBST(root.left);if(pre!=null&&pre.val>=root.val)return false;pre=root;boolean right = isValidBST(root.right);return left&&right;}


http://www.ppmy.cn/embedded/6865.html

相关文章

第十四届蓝桥杯省赛C/C++大学B组真题-飞机降落

思路&#xff1a;根据数据范围N<10猜测用DFS剪枝&#xff0c;因为菜狗不会状压dp。根据题目&#xff0c;一般这种飞机的题都会用到贪心的思想。思想是每架飞机都要卡极限最早降落时间&#xff0c;从而保证后面的飞机能够有充足时间降落。 代码参考博客MQy大佬有详细解答 #i…

Python 物联网入门指南(一)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 这个学习路径将带您进入机器人世界&#xff0c;并教会您如何利用树莓派和 Python 实现一切。 它教会您如何利用树莓派 3 和树莓派零…

出现 -30036ORA-30036: 无法按8扩展段(在还原表空间‘UNDOTBS1‘中) 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 扩增3.2 建表1. 问题所示 工作中的Oracle出现如下问题: -30036ORA-30036: 无法按8扩展段(在还原表空间UNDOTBS1中)截图如下:

前端开发中可以使用的 ChatGPT Prompts

代码补全 示例&#xff1a;补全下列代码&#xff1a;"""需要补全的代码"""&#xff08;或者改成需要补全的代码&#xff09; 代码转换 示例&#xff1a;将下列代码片段从 JavaScript 转换为 TypeScript&#xff1a;"""需要转换…

代码随想录算法训练营第四十九天|leetcode516、647题

1、leetcode第647题 本题要求找字符串中回文子串的数目&#xff0c;因此设置dp数组&#xff0c;dp[i][j]的含义是从下标i到j的子串是不是回文串&#xff0c;因此递推公式为&#xff1a;在s[i]s[j]时如果间距小于等于1或者间距大于1时dp[i1][j-1]为回文串则dp[i][j]也为回文串。…

SQL约束

文章目录 约束约束的分类&#xff1a;按照约束的作用效果不同唯一约束主键约束外键约束检查约束非空约束默认值约束 按照是否跟随列和字段属性来创建约束行级约束表级约束 创建约束创建唯一约束创建完表之后创建唯一约束创建表的同时创建唯一约束行级约束表级约束 创建主键约束…

CentOS配置LNS和VSR作为LAC建立L2TP隧道

正文共&#xff1a;1859字 13图&#xff0c;预估阅读时间&#xff1a;5 分钟 很久之前发过配置服务器上公网的文章&#xff08;我用100块钱把物理服务器放到了公网&#xff0c;省了几万块&#xff01;&#xff09;&#xff0c;当时服务端是CentOS 7的系统&#xff0c;L2TP拨号用…

关系型数据库的相关概念

表、记录、字段 表 一个实体集相当于一个表记录 一个实体相当于一个记录&#xff0c;在表中表表现为一行数据字段 一个字段相当于数据库表中的列 表的关联关系 一对一(一对一的表可以合并成一张表)一对多多对多 必须创建第三张表&#xff0c;该表通常称为联接表&#xff0c…