JS leetcode求二叉树的最大深度
递归实现
思路:遍历左右结点获取深度,没下一层深度加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求二叉树的最大深度相关推荐
- 104.求二叉树的最大深度 Maximum Depth of Binary Tree
求二叉树的最大深度 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...
- php 实现二叉树的最大深度_Java如何实现求二叉树的最大深度(附代码)
本篇文章给大家带来的内容是关于Java如何实现求二叉树的最大深度(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远 ...
- Leetcode—— 104. 二叉树的最大深度
104. 二叉树的最大深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nu ...
- 精选力扣500题 第56题 LeetCode 104. 二叉树的最大深度【c++/java详细题解】
目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. ...
- Leetcode 104.二叉树的最大深度 (每日一题 20210625)
给定一个二叉树,找出其最大深度.二叉树的深度为根节点到最远叶子节点的最长路径上的节点数.说明: 叶子节点是指没有子节点的节点.示例: 给定二叉树 [3,9,20,null,null,15,7],3/ ...
- [leetcode]104.二叉树的最大深度
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...
- LeetCode 104二叉树的最大深度-简单
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...
- leetcode - 104. 二叉树的最大深度
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...
- LeetCode 104.二叉树的最大深度(递归)
题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,1 ...
最新文章
- Java中常见数据结构Map之HashMap
- vue开发入门篇(二)-axios POST提交数据的三种请求方式写法
- 同一张表两方各字段相同_SQL高级知识——派生表
- python 删除list中的第一个元素
- c++中的向量容器(vector)
- go mod的使用细节
- 《Linux系统和网络性能监测》读书笔记
- Eclipse之如何快速查看抽象函数实现
- vue的Prop属性
- Winform下的键盘事件
- 配置Gitlab Push自动触发jenkins构建
- linux找不到mysql服务_linux mysql 找不到 mysql/mysql.h
- How is NGINX Unit different from Apache?
- Eclipse 2021-6安装教程及其安装包
- IDEA 解决一直加载Refreshing VCS history
- C4D景深与运动模糊及hdr预设文件添加技巧
- 开发服务器 k8s 设置 自定义 dns解析
- dev C++遇到endl无法调试的解决方法
- 英文学术论文写作——模式识别方向(笔记)
- 2022年5篇图神经网络最新的研究综述