二叉树的最小深度

题目

https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/

二叉树定义如下:

// Definition for a binary tree node.
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}

普通版题解

  • 时间复杂度O(n),需要遍历所有的节点。
  • 空间复杂度为O(h)。其中,h 表示二叉树的高度,也就是递归使用的系统调用栈的高度。
class Solution {public int minDepth(TreeNode root) {if (root != null) {if (root.left == null || root.right == null) {// 根部只有一个孩子或没有孩子return Math.max(minDepth(root.left), minDepth(root.right)) + 1;} else { // 根部有两个孩子return Math.min(minDepth(root.left), minDepth(root.right)) + 1;}} else return 0;}
}

进阶版:根据 Morris 遍历改写

  • 时间复杂度O(n),需要遍历所有的节点。
  • 空间复杂度为O(1)。

代码(含测试用例)
package chapter_3_binarytreeproblem;public class Problem_02_MinDepth {public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}public static int minDepth1(Node head) {if (head == null) {return 0;}return process(head, 1);}public static int process(Node cur, int level) {if (cur.left == null && cur.right == null) {return level;}if (cur.left != null && cur.right == null) {return process(cur.left, level + 1);}if (cur.left == null && cur.right != null) {return process(cur.right, level + 1);}return Math.min(process(cur.left, level + 1), process(cur.right, level + 1));}// 根据 morris 遍历改写public static int minDepth2(Node head) {if (head == null) {return 0;}Node cur = head;Node mostRight = null;int curLevel = 0;int minHeight = Integer.MAX_VALUE;while (cur != null) {mostRight = cur.left;if (mostRight != null) { // 当前cur有左子树,能到达两次// cur左子树上,右边界的节点个数int leftTreeRightSize = 1;// 找到cur左子树上最右的节点while (mostRight.right != null && mostRight.right != cur) {leftTreeRightSize++;mostRight = mostRight.right;}if (mostRight.right == null) {// 第一次到达cur,那么下一个节点的level必然+1curLevel++;mostRight.right = cur;cur = cur.left;continue;} else {// 第二次到达cur,那么下一个节点的level=curLevel-leftTreeRightSize,此时检查mostRight是不是叶节点。记录答案if (mostRight.left == null) {minHeight = Math.min(minHeight, curLevel);}curLevel -= leftTreeRightSize;mostRight.right = null;}} else {// 当前xue没有欧左子树,只能到达一次,那么下一个节点的level必然+1curLevel++;}cur = cur.right;}int finalRight = 1;cur = head;while (cur.right != null) {finalRight++;cur = cur.right;}// 最后不要忘了单独看看整棵树的最右节点是不是叶节点if (cur.left == null && cur.right == null) {minHeight = Math.min(minHeight, finalRight);}return minHeight;}public static void main(String[] args) {Node node1 = new Node(1);Node node2 = new Node(2);node1.right = node2;Node node3 = new Node(3);node2.left = node3;Node node4 = new Node(4);Node node5 = new Node(5);node3.left = node4;node3.right = node5;System.out.println(minDepth2(node1));}}

二叉树的最大深度

剑指 Offer 55 - I. 二叉树的深度

题解

一行代码解决!

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

左神算法:二叉树的最大 / 最小深度(普通+Morris遍历进阶)(Java版)相关推荐

  1. 实现一个二叉树层级遍历_算法总结:左神class5—二叉树递归和非递归实现遍历(后序用一个栈彩蛋)...

    二叉树类型的题目为常考题型 1.能够结合队列.栈.链表.字符串等很多数据结构. 2.需要掌握图的基本遍历方式,比如BFS和DFS. 3.需要掌握递归函数的使用,并自己设计出递归过程. 4.与实际工作结 ...

  2. 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)

    本题来自左神<程序员面试代码指南>"最大值减去最小值小于或等于num的子数组的数量"题目. 题目 给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况: ...

  3. 左神算法:求最大子矩阵的大小(Java版)

    本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...

  4. 左神算法:判断二叉树是否为平衡二叉树(树形dp套路,Java版)

    本题来自左神<程序员代码面试指南>"判断二叉树是否为平衡二叉树"题目. 题目 平衡二叉树的性质为:要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过 1. ...

  5. 左神算法:调整搜索二叉树中两个错误的节点(Java版)

    本题来自左神<程序员代码面试指南>"调整搜索二叉树中两个错误的节点"题目. 题目 原问题: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再 ...

  6. 左神算法:二叉树的按层打印与ZigZag打印(Java版)

    本题来自左神<程序员代码面试指南>"二叉树的按层打印与ZigZag打印"题目. 题目 给定一棵二叉树的头节点 head,分别实现 按层 和 ZigZag 打印 二叉树的 ...

  7. 左神算法:在二叉树中找到累加和为指定值的最长路径长度(Java版)

    本题来自左神<程序员代码面试指南>"在二叉树中找到累加和为指定值的最长路径长度"题目. 题目 给定一棵二叉树的头节点 head 和一个 32 位整数 sum,二叉树节点 ...

  8. 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)

    本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...

  9. 左神算法:将搜索二叉树转换成双向链表(Java版)

    本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...

最新文章

  1. Spring boot mongodb
  2. 小白开学Asp.Net Core 《十》
  3. URAL 1830 Help in the RNOS 思路,读题 难度:1
  4. java质数判断程序_java判断一个数是否为素数/质数
  5. 内存位置访问无效 midas.dll_java并发之内存模型
  6. win10饥荒服务器未响应,win10系统玩饥荒联机很卡如何解决[多图]
  7. 十八般武艺玩转GaussDB(DWS)性能调优(二):坏味道SQL识别
  8. Linux内核网络协议栈8—socket监听
  9. 正则 (?i,m,s,x,g)
  10. gSLICr: SLIC superpixels at over 250Hz
  11. outlook 让附件在正文中显示 (REF rich リッチ)
  12. mysql json字符串_mysql如何截取一个json字符串?
  13. react系列之isMounted is an Antipattern
  14. mac os安装Windows系统失败后不能合并为一个分区
  15. 输入等值线参数绘制等值线图python_专题复习:等值线(上)
  16. Word中插入目录时未找到目录项
  17. 谷歌中国3月28日发年终奖 不少员工将选择离职【转载】
  18. 【深入理解计算机系统】CSAPP-实验四:ArchLab全网最详细
  19. Adobe Xd快捷键(Win 10)-UI设计更便捷
  20. 小猿圈python视频_小猿圈分享学习Python的最佳方式

热门文章

  1. POJ - 1475 Pushing Boxes(bfs套bfs)
  2. POJ - 3259 Wormholes(判断负环)
  3. 深度学习项目-神经元结构可视化
  4. 贝叶斯学习及共轭先验
  5. 网狐棋牌游戏平台服务器架构设计分析
  6. Win32多线程编程(3) — 线程同步与通信
  7. 看完这篇还不清楚Netty的内存管理,那我就哭了!
  8. Kafka发送超过broker限定大小的消息时Client和Broker端各自会有什么异常?
  9. OS- -文件系统(一)
  10. 美团/力扣(647)--回文字串