训练营第十七天(二叉树part04)

2024-04-06 23:28

本文主要是介绍训练营第十七天(二叉树part04),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十七天 二叉树part04

110.平衡二叉树

力扣题目链接(opens new window)

题目

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

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

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

在这里插入图片描述

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

在这里插入图片描述

返回 false 。

解答

求深度,后序遍历

  • 左子树如果不是平衡二叉树,没有继续的必要,直接结束
  • 右子树如果不是平衡二叉树,同样也没有继续的必要
  • 最后如果左右子树高度差距大于1,也就结束,不是平衡二叉树,否则就继续
class Solution {public boolean isBalanced(TreeNode root) {return getHeight(root) != -1;//-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,也就结束if (Math.abs(leftHeight - rightHeight) > 1)return -1;elsereturn Math.max(leftHeight,rightHeight) + 1;}
}

257. 二叉树的所有路径

力扣题目链接(opens new window)

题目

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

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

示例:

在这里插入图片描述

解答

注意进行回溯,不然无法寻找第二条路径,每次递归就会回溯一次

class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList<>();// 存最终的结果if (root == null) {return res;}List<Integer> path = new ArrayList<>();// 作为结果中的路径traversal(root, path, res);return res;}private void traversal(TreeNode root, List<Integer> path, List<String> res){path.add(root.val);//必须放在if前,不然直接到叶子节点会结束,叶子结点的值不会放到path里面if (root.left == null && root.right == null){//到了叶子StringBuilder sb = new StringBuilder();for (int i = 0; i < path.size() - 1; i++) {sb.append(path.get(i)).append("->");}sb.append(path.get(path.size() - 1));// 记录最后一个节点res.add(sb.toString());// 收集一个路径return;}if (root.left != null) { // 左traversal(root.left, path, res);path.remove(path.size() - 1);// 进行回溯,移除最下面的元素//因为当前会找到下一级结点,直接递归到叶子结点,那么进行递归回溯后,每次移除一个,才能更新path}if (root.right != null) { // 右traversal(root.right, path, res);path.remove(path.size() - 1);// 进行回溯,移除最下面的元素}}
}

404.左叶子之和

力扣题目链接(opens new window)

题目

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

示例:

在这里插入图片描述

解答

对于递归树,只可能出现两个情况

  1. 当前的结点的左子树是左叶子,那么最终值为左叶子值+右子树的结果
  2. 左子树不是左叶子,最终值为左子树的结果+右子树的结果
class Solution {public int sumOfLeftLeaves(TreeNode root) {if (root == null)return 0;TreeNode left = root.left;if (left != null && left.left == null && left.right == null)return left.val + sumOfLeftLeaves(root.right);return sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right);}
}

这篇关于训练营第十七天(二叉树part04)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881104

相关文章

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

【代码随想录训练营第42期 续Day52打卡 - 图论Part3 - 卡码网 103. 水流问题 104. 建造最大岛屿

目录 一、做题心得 二、题目与题解 题目一:卡码网 103. 水流问题 题目链接 题解:DFS 题目二:卡码网 104. 建造最大岛屿 题目链接 题解:DFS  三、小结 一、做题心得 也是成功补上昨天的打卡了。 这里继续图论章节,还是选择使用 DFS 来解决这类搜索问题(单纯因为我更熟悉 DFS 一点),今天补卡的是水流问题和岛屿问题。个人感觉这一章节题对于刚

第十七题:电话号码的字母组合

题目描述 给定一个仅包含数字 2-9 的字符串,返回所有可能的由它组成的字母组合。你可以假设输入字符串至少包含一个数字,并且不超过3位数字。 实现思路 使用哈希表或数组存储每个数字对应的字符,然后通过递归或迭代的方式生成所有可能的组合。如果字符串长度为n,则可以看作是n层循环,每层循环可以选择对应数字的所有字符之一。 算法实现 C语言实现 #include <stdio.h>#inc

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ