递归实现

思路:遍历左右结点获取深度,没下一层深度加1。

function BTMaxDeep(root) {if (!root) {return 0;}let maxLeft = BTMaxDeep(root.left);let maxRight = BTMaxDeep(root.right);const max = Math.max(maxLeft, maxRight);return max + 1;
}

迭代实现

广度优先遍历

思路:要使用栈来存储每一层的结点,然后再遍历每个结点是否拥有孩子,有就用另一个栈存起来,然后不断替换。

function BTMaxDeepByBFS(root) {if (!root) {return 0;}let stack = []; //记录每一层的结点let deep = 0;stack.push(root);while (stack.length > 0) {//记录下一层的结点,因为push动作回导致数组长度变化,所以。。。const arr = [];//取出每个结点,判断每个结点是否存在左右孩子,有就存起来stack.forEach(ele => {if (ele.left) {arr.push(ele.left);}if (ele.right) {arr.push(ele.right);}})//替换层栈, 同时深度加1stack = arr;deep++;}return deep;
}

深度优先遍历

这里的深度特别难搞,让我整个菜鸟卡了好久。
思路:同样要使用栈来存储结点,从根结点开始,先遍历所有左结点,然后再不断回退。

摘自数据结构(C语言版)清华大学:其一是递归调用的语句编号,其二是指向根节点的指针,则当栈顶记录中的指针非空时,应该遍历左子树,即指向左子树根的指针进栈。若栈顶记录中的指针值为空,则应该退至上一层,若是从左子树返回,则应访问当前层即栈顶记录中指针所指的根节点。若是从右子树返回,应继续退栈。

这里是中序遍历二叉树的代码:

Status InOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){//采用二叉链表存储结构,Visit是对数据元素操作的应用函数。//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit;InitStack(S);  Push(S,T);  //根指针进栈while(!StackEmpty(S)){while(GetTop(S, p) && p Push(S, p->lchild);Pop(S, p);   //空指针退栈if(!StackEmpty(S)){  //访问结点向右异步Pop(S, p) if(!Visit(p->data)) return ERROR;Push(S, p->rchild);}}return OK;
}

这里是中序遍历二叉树并记录最深深度的js代码。再回退结点的时候和遍历右子树的时候卡了很久,后来就想到要记录每个结点的深度,这样回退的时候就知道当前遍历的深度是多少。

unction maxDeep3(root) {if (!root) {return 0;}const stack = []; //记录结点和每个结点的深度let deep = 1,maxDeep = -Infinity;stack.push({ root, deep });//根节点进栈while (stack.length > 0) {//每次取栈顶元素root = stack[stack.length - 1].root;while (root) {root = root.left;if(root){deep++;}stack.push({ root: root, deep });}//空结点退栈stack.pop();if (stack.length > 0) {const obj = stack.pop();root = obj.root;if (root.right) {deep = obj.deep+1; //向右一步}else{maxDeep = maxDeep > deep ? maxDeep : deep;}stack.push({ root: root.right, deep });}}return maxDeep;
}

声明:作者处于菜鸟阶段,还在不断学习,代码与思想仅供参考,欢迎指正。

复杂事往简单了去想,是拆解,是切割,就像一剑破万法,而将简单事往复杂了去想,是缝补,是搭建,是打造小天地。——《剑来》

JS leetcode求二叉树的最大深度相关推荐

  1. 104.求二叉树的最大深度 Maximum Depth of Binary Tree

    求二叉树的最大深度 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  2. php 实现二叉树的最大深度_Java如何实现求二叉树的最大深度(附代码)

    本篇文章给大家带来的内容是关于Java如何实现求二叉树的最大深度(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远 ...

  3. Leetcode—— 104. 二叉树的最大深度

    104. 二叉树的最大深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nu ...

  4. 精选力扣500题 第56题 LeetCode 104. 二叉树的最大深度【c++/java详细题解】

    目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. ...

  5. Leetcode 104.二叉树的最大深度 (每日一题 20210625)

    给定一个二叉树,找出其最大深度.二叉树的深度为根节点到最远叶子节点的最长路径上的节点数.说明: 叶子节点是指没有子节点的节点.示例: 给定二叉树 [3,9,20,null,null,15,7],3/ ...

  6. [leetcode]104.二叉树的最大深度

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...

  7. LeetCode 104二叉树的最大深度-简单

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...

  8. leetcode - 104. 二叉树的最大深度

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...

  9. LeetCode 104.二叉树的最大深度(递归)

    题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,1 ...

最新文章

  1. Java中常见数据结构Map之HashMap
  2. vue开发入门篇(二)-axios POST提交数据的三种请求方式写法
  3. 同一张表两方各字段相同_SQL高级知识——派生表
  4. python 删除list中的第一个元素
  5. c++中的向量容器(vector)
  6. go mod的使用细节
  7. 《Linux系统和网络性能监测》读书笔记
  8. Eclipse之如何快速查看抽象函数实现
  9. vue的Prop属性
  10. Winform下的键盘事件
  11. 配置Gitlab Push自动触发jenkins构建
  12. linux找不到mysql服务_linux mysql 找不到 mysql/mysql.h
  13. How is NGINX Unit different from Apache?
  14. Eclipse 2021-6安装教程及其安装包
  15. IDEA 解决一直加载Refreshing VCS history
  16. C4D景深与运动模糊及hdr预设文件添加技巧
  17. 开发服务器 k8s 设置 自定义 dns解析
  18. dev C++遇到endl无法调试的解决方法
  19. 英文学术论文写作——模式识别方向(笔记)
  20. 2022年5篇图神经网络最新的研究综述

热门文章

  1. NAL header
  2. uiwebview html 位置,UIWebView 详解
  3. js tree设置层级关系
  4. mac上Foxmail登录163邮箱账号提示SMTP服务器:邮箱地址或密码错误
  5. skimage data函数库
  6. scratch编程和c语言哪个好,少儿编程scratch与C语言去区别
  7. Excel快速填充常用方法
  8. VS Code实现智能提示
  9. 网站使用实体服务器没备案可以么,服务器域名没备案能https吗?
  10. Debain10忘记root用户密码怎么办