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

代码随想录算法训练营Day14 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

目录

226.翻转二叉树

101. 对称二叉树

104.二叉树的最大深度

111.二叉树的最小深度

226.翻转二叉树

题目

226. 翻转二叉树 - 力扣(LeetCode)

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

在这里插入图片描述

示例2:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100]
  • -100 <= Node.val <= 100

思路

视频讲解:LeetCode:226.翻转二叉树

代码随想录:226.翻转二叉树

想要翻转一颗二叉树,只需要把每一个节点的左右孩子都翻转一下,即可获得整体翻转的效果。

使用递归法时可以选择使用前序遍历或者后序遍历,前序遍历过程如下:

翻转二叉树

此外,还可以使用层序遍历。

题解

递归法:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        return invert(root);
    }

    TreeNode invert(TreeNode root) {
        if (root == null)
            return root;
        if (root.left != null)
            invert(root.left);
        if (root.right != null)
            invert(root.right);
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        return root;
    }
}

层序遍历:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        Deque<TreeNode> deque = new ArrayDeque<>();
        if (root == null)
            return root;
        deque.offer(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                TreeNode tmp = node.left;
                node.left = node.right;
                node.right = tmp;
                if (node.left != null)
                    deque.offer(node.left);
                if (node.right != null)
                    deque.offer(node.right);
            }
        }
        return root;
    }
}

101. 对称二叉树

题目

101. 对称二叉树 - 力扣(LeetCode)

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

示例1:

输入:root = [1,2,2,3,4,4,3]
输出:true

img

示例2:

输入:root = [1,2,2,null,3,null,3]
输出:false

img

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

思路

代码随想录:101.对称二叉树

视频讲解:LeetCode:101. 对称二叉树

如果一棵二叉树是对称的,其根节点的左子树和右子树是镜像对称的,所以本题需要比较根节点的左右子树是否对称。

递归法:

  1. 先确定递归方法的参数为左子树和右子树中相对应的节点,返回值为布尔类型。
  2. 确定中止情况:左右两个节点都为空时,对称;左右两个节点其中一个为空时,不对称;左右两个节点值不同时,不对称。
  3. 比较两次,一次比较外侧的两个节点,一次比较内侧的两个节点。

迭代法:每次迭代时将左右两侧对应的节点一起放入队列中,每次取两个队列中的元素出来进行比较。

题解

递归法:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }

    boolean compare(TreeNode left, TreeNode right) {
        if (left == null && right == null)
            return true;
        if ((left == null && right != null) || (left != null && right == null))
            return false;
        if (left.val != right.val)
            return false;
        boolean out = compare(left.left, right.right);
        boolean in = compare(left.right, right.left);
        return out == true && in == true;
    }
}

迭代法:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root.left);
        deque.offer(root.right);
        while (!deque.isEmpty()) {
            TreeNode left = deque.poll();
            TreeNode right = deque.poll();
            if (left == null && right == null)
                continue;
            if (right == null || left == null || left.val != right.val)
                return false;
            deque.offer(left.left);
            deque.offer(right.right);
            deque.offer(left.right);
            deque.offer(right.left);
        }
        return true;
    }
}

104.二叉树的最大深度

题目

104. 二叉树的最大深度 - 力扣(LeetCode)

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例1:

输入:root = [3,9,20,null,null,15,7]
输出:3

在这里插入图片描述

思路

视频讲解:LeetCode:104.二叉树的最大深度

代码随想录:104.二叉树的最大深度

此题除了层序遍历之外,还可以使用递归法。

树的深度等于左子树深度和右子树深度中的最大值+1。

  • 递归终止条件:当前节点为空。

  • 找出返回值:节点为空时说明子树高度为 0,返回 0,节点不为空时则分别求左右子树的高度,取两者中的最大值加 1 表示当前节点的高度,返回该数值。

题解

层序遍历:

class Solution {
    public int maxDepth(TreeNode root) {
        int res = 0;
        Deque<TreeNode> deque = new ArrayDeque<>();
        if (root == null)
            return res;
        deque.offer(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                if (node.left != null)
                    deque.offer(node.left);
                if (node.right != null)
                    deque.offer(node.right);
            }
            res++;
        }
        return res;
    }
}

递归法:

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            int left = maxDepth(root.left);
            int right = maxDepth(root.right);
            return Math.max(left, right) + 1;
        }
    }
}

111.二叉树的最小深度

题目

视频讲解:LeetCode:111.二叉树的最小深度

代码随想录:111.二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

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

示例1:

输入:root = [3,9,20,null,null,15,7]
输出:2

在这里插入图片描述

提示:

  • 树中节点数的范围在 [0, 105]
  • -1000 <= Node.val <= 1000

思路

代码随想录:111.二叉树的最小深度

除了层序遍历,还可以使用递归法,对于每一个非叶子节点,分别计算其左右子树的最小叶子节点深度。

题解

层序遍历:

class Solution {
    public int minDepth(TreeNode root) {
        int res = 0;
        Deque<TreeNode> deque = new ArrayDeque<>();
        if (root == null)
            return res;
        deque.offer(root);
        res++;
        while (!deque.isEmpty()) {
            int size = deque.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                if (node.left == null && node.right == null)
                    return res;
                if (node.left != null)
                    deque.offer(node.left);
                if (node.right != null)
                    deque.offer(node.right);
            }
            res++;
        }
        return res;
    }
}

递归法:

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null)
            return 0;
        if (root.left == null && root.right == null)
            return 1;
        int min = Integer.MAX_VALUE;
        if (root.left != null)
            min = Math.min(minDepth(root.left), min);
        if (root.right != null)
            min = Math.min(minDepth(root.right), min);
        return min + 1;
    }
}

http://www.kler.cn/a/317986.html

相关文章:

  • 计算机网络 (1)互联网的组成
  • DBeaver 连接 OceanBase Oracle 租户
  • 深度学习神经网络在机器人领域应用的深度剖析:原理、实践与前沿探索
  • 开源项目推荐——OpenDroneMap无人机影像数据处理
  • 手动实现promise的all,race,finally方法
  • WebGIS三维地图框架--Cesium
  • 【MySQL内置数据库】information_schema
  • 【C++】检测TCP链接超时——时间轮组件设计
  • 自学前端的正确姿势是...
  • 第17周 第2章Session与ServletContext原理 ---ServletContext与三大作用域对象
  • PerparedStatement概述
  • Qt 模型视图(三):视图类QAbstractItemView
  • Python常见Json对比库deepdiff、json_tools、jsonpatch
  • 【Python】curl命令、Api POST导入cURL、python直接使用cURL
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】下
  • 球体检测系统源码分享
  • Rust的作用?
  • tar.gz 文件压缩与解压shell实现
  • 付费电表系统的通用功能和应用过程参考模型(下)
  • 鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)天气应用案例
  • R语言NHANES数据分析(2)
  • Angular面试题五
  • LeetCode_sql_day30(1264.页面推荐)
  • 蓝桥等考C++组-2022-11-27-八级
  • 【C++】C++中如何处理多返回值
  • Vue|插件