首页 > 其他分享 >代码随想录day14 | leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

代码随想录day14 | leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

时间:2024-12-10 20:57:06浏览次数:7  
标签:right return 随想录 二叉树 深度 TreeNode null root left

226.翻转二叉树

前序和后序写法都可以 我用的是前序
错误写法

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
        swap(root.left,root.right);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
    public void swap(TreeNode left, TreeNode right) {
        TreeNode temp = left;
        left = right;
        right = temp;
    }
}

为什么 swap 方法不起作用?

Java 的参数传递机制是 按值传递,即传递的是变量的值,而不是引用本身。对于引用类型(如 TreeNode),传递的是引用的副本。因此:

  1. swap(TreeNode left, TreeNode right) 中交换 leftright 时,只是交换了局部变量 leftright,不会影响传入的 root.leftroot.right
  2. root.leftroot.right 的实际值在方法外部并没有改变。
    正确写法
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
        swap(root);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
    public void swap(TreeNode root) {
        if(root == null) return;
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }
}

在递归中,是否需要 return null; 或仅仅 return;两种情况的区别:

1. void 方法:直接 return;

void 方法中,比如 swap(TreeNode node),方法本身不需要返回任何值。
因此,当递归到终止条件时,仅仅用 return; 即可终止当前递归调用,并让控制流回到上一层。
示例:

public void swap(TreeNode node) {
    if (node == null) return; // 递归终止,退出当前方法
    TreeNode temp = node.left;
    node.left = node.right;
    node.right = temp;
}
  • return; 的作用:退出当前方法,没有返回值。
  • 为什么不需要 return null; 因为方法的返回类型是 void,本来就不能返回值,return; 就足够。
2. 有返回值的方法:需要返回值,比如 return null;

在返回类型不是 void 的递归方法中(比如 TreeNode invertTree(TreeNode root)),必须按照方法签名返回一个与返回类型一致的值。如果递归的终止条件是空节点(root == null),此时返回值应该是 null
示例:

public TreeNode invertTree(TreeNode root) {
    if (root == null) return null; // 递归终止,返回 null
    TreeNode temp = root.left;
    root.left = root.right;
    root.right = temp;
    invertTree(root.left);
    invertTree(root.right);
    return root; // 返回当前节点
}
  • return null; 的作用:在递归中明确表示当前子树为空,用于返回递归终止的结果。
  • 为什么不能只用 return; 因为方法的返回类型是 TreeNodereturn; 不符合类型要求。

理解两者的适用场景

什么时候用 return null;
  • 方法有返回值(非 void),比如 TreeNode
  • 表示递归的终止条件,并且需要将结果(比如 null)传递回上一层递归调用。
什么时候用 return;
  • 方法是 void 类型,不需要返回任何值。
  • 表示递归的终止条件,仅仅退出当前方法即可。

101.对称二叉树

只能用后序遍历 因为先获取中值无法进行后续比较
在这里插入图片描述

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }
    public boolean compare(TreeNode left, TreeNode right) {
        if(left != null && right == null) {
            return false;
        }else if(left == null && right != null) {
            return false;
        }else if(left == null && right == null) {
            return true;
        }else if(left.val != right.val) {
            return false;
        }
        boolean CompareOutside = compare(left.left, right.right); //比较外侧
        boolean CompareInside = compare(left.right, right.left); //比较内侧
        return CompareInside && CompareOutside;
    }
}

不难 重要是打开思路 判断终止条件可以有很多

104.二叉树的最大深度

求高度用后序遍历,求深度用前序遍历

而根节点的高度就是二叉树的最大深度
在一棵二叉树中:

  • 最大深度从根节点向下计算(从根到叶子)。
  • 高度从叶子节点向上计算(从叶子到根)。
    因此,根节点的高度就等于整棵树的最大深度。
104.二叉树的最大深度
class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null) return 0;
        int leftheight = maxDepth(root.left);
        int rightheight = maxDepth(root.right);
        int height = 1 + Math.max(leftheight,rightheight);
        return height;
    }
}

559.n叉树的最大深度
class Solution {
    public int maxDepth(Node root) {
        if(root == null) return 0;

        int depth = 0;
        if(root.children != null) {
            for(Node child : root.children) {
                depth = Math.max(depth,maxDepth(child));
            }
        }
        return 1 + depth;
    }
}

后序遍历的定义

后序遍历(Post-order Traversal)是指:

  1. 首先递归处理左子树(或子树的所有子节点)。
  2. 然后递归处理右子树(或子树的其他子节点)。
  3. 最后处理当前节点。

对于 N 叉树来说,后序遍历就是:

  1. 先递归处理每个子节点。
  2. 最后处理当前节点(计算当前节点的深度)。
  • 递归顺序
    • 当我们调用 maxDepth(child) 时,我们是先计算子节点的深度,递归地访问每个子节点。这个部分类似于后序遍历的 “先处理子节点”
    • 当所有子节点都被访问过后,代码才会在 return depth + 1处理当前节点,这符合后序遍历的 “处理当前节点”
  • 子节点递归:
    • 递归调用 maxDepth(child) 对每个子节点进行处理,直到到达叶子节点为止。
    • 每次递归返回时,都会把当前子节点的深度更新到 depth 变量中。只有当所有子节点都被处理完后,才会计算并返回当前节点的深度。
  • 返回当前节点的深度:
    • 当前节点的深度是 depth + 1,即在遍历完所有子节点后才计算当前节点的深度。也就是只有在处理完所有子节点之后,才返回该节点的深度。

二叉树的最小深度

题目中说的是:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。注意是叶子节点
image.png
所以不能直接把求最大深度的代码换成Math.min()直接用

class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        int mindepth = 0;
        int leftheight = minDepth(root.left);
        int rightheigth = minDepth(root.right);
        if(root.left == null) {
            return 1 + rightheigth;
        }
        if(root.right == null) {
            return 1 + leftheight;
        }
        return 1 + Math.min(leftheight, rightheigth);
    }
}

一定要记得1+ 不然高度没被记录

标签:right,return,随想录,二叉树,深度,TreeNode,null,root,left
From: https://blog.csdn.net/2302_81139517/article/details/144376398

相关文章

  • 124. 二叉树中的最大路径和
    问题描述二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。路径和是路径中各节点值的总和。给你一个二叉树的根节点root,返回其最大路径和。分析树形D......
  • 二叉搜索树深度解析:三个关键算法(235,669,108)
    ......
  • 236. 二叉树的最近公共祖先
    问题描述给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”分析使用递归解决比较简单,但是不太......
  • 105. 从前序与中序遍历序列构造二叉树
    问题描述分析逻辑上,从前序遍历中依次从前往后获取根结点,从中序里获取根结点的序号后可以获取左子树和右子树,递归构建树即可。分治/递归classSolution{public:vector<int>preorder;vector<int>inorder;unordered_map<int,int>um;//分治TreeNo......
  • LCR 048. 二叉树的序列化与反序列化(困难)(主站297)
    https://leetcode.cn/problems/h54YBf/https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/难度:☆☆☆题目:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另......
  • SCI论文丨机器学习与深度学习论文
    目录第一章、ChatGPT-4o使用方法与技巧第二章、ChatGPT-4o辅助文献检索、总结与分析第三章、ChatGPT-4o辅助学术论文选题、创新点挖掘与实验方案设计第四章、ChatGPT-4o辅助学术论文开题与大纲生成第五章、ChatGPT-4o辅助学术论文写作马拉松活动介绍第六章、ChatGPT-4o......
  • PAT 2024年春季 甲级 A-3 Degree of Skewness(二叉树的构建)
     给出后序和中序遍历序列,求出只有左子树和只有右子树的结点之差1#include<bits/stdc++.h>2usingnamespacestd;3intn;4intnl=0,nr=0;5structnode{6intdata,lchild=-1,rchild=-1;7};8vector<node>nodes(1005);9vector<int>in_o......
  • leetcode543.二叉树的直径
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • 深度学习之视觉处理
    CNN视觉处理三大任务:分类、目标检测、图像分割上游:提取特征,CNN下游:分类、目标、分割等,具体的任务概述卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域,往往我们输入的图像都很大,使用全连接网络的话,计算的代价较高。另外图像也很难保留原有的特征,导......
  • Pytorch 手写数字识别 深度学习基础分享
    本篇是一次内部分享,给项目开发的同事分享什么是深度学习。用最简单的手写数字识别做例子,讲解了大概的原理。手写数字识别展示首先数字识别项目的使用。项目实现过程:训练出模型准备html手写板flask框架搭建简单后端深度学习必备知识介绍机器学习的概念通俗解释机......