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

二叉树的算法题目

二叉树的遍历题目

二叉树遍历一般包含三种分别为:根左右、左根右、左右根(又称为前序遍历、中序遍历、后序遍历)

方法一:使用递归遍历               方法二:使用迭代使用栈

我们以左根右(中序遍历)为例:下列代码中,我们在遍历题目中我们展示方法二,用来存储我们的运行过程中访问到的结点。

  1. 第一个while如果根结点不是空或者栈不是空的,我们就循环执行
  2. 第二while,当根结点不为空时,把结点放到我们的栈中,并访问根的左子树
  3. 当没有左子树可访问后,提取出栈的最后一个进入的子树
  4. 把该子树放到列表中
  5. 然后再访问该结点的右子树,(但是由于该结点没有右子树时,这重新进入循环,重复1-5这些步骤)

上述步骤如有不清楚,可以参考下图卡片链接视频,视频第9分钟的时候

1-024-_(LeetCode-94) 二叉树的中序遍历_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1eg411w7gn?p=25&vd_source=6d86118bce41ec0856a5d50f6c17a7e7上述代码,无论是前中后序遍历,只要将res.add(root.val)移动一下位置即可,在前序中,把该代码反到循环内,在每次访问根节点的时候,直接将根节点的值放到res中;

而后序则是完全不一样,由于在访问结点过程中先访问左结点后,必须访问右结点(除没有右节点外),所以在出栈后的结点,需查找它的右节点,找到好先对右节点进行排序,最后再排出栈的结点。所以其算法编写为:

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Deque<TreeNode> stack = new LinkedList<>();TreeNode prevAccess = null;while(root!=null || !stack.isEmpty()){while(root!=null){stack.push(root);root = root.left;}root = stack.pop();if(root.right == null || root.right == prevAccess){res.add(root.val);prevAccess = root;root =null;}else{stack.push(root);root = root.right;}}return res;}
}

若有不懂得题目,可以点击下面卡片链接1-026-(LeetCode-145) 二叉树的后序遍历_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1eg411w7gn?p=27&vd_source=6d86118bce41ec0856a5d50f6c17a7e7

二叉树镜像对称题目

解决方法一:定义一个递归方法,循环遍历左子树的左孩子和右子树的右孩子进行比较,在比较左右孩子和右左孩子

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {if(root == null){return true;}return deepCheck(root.left,root.right);}boolean deepCheck(TreeNode left, TreeNode right){if(left==null && right==null){return true;}if(left==null || right==null){return false;}if(left.val != right.val){return false;}return deepCheck(left.left,right.right)&& deepCheck(left.right,right.left);}
}

方法二:循环迭代的方法,这里用到了队列

这里可以看下面卡片第三分钟有所介绍:1-027-(LeetCode-101) 对称二叉树_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1eg411w7gn?p=28&vd_source=6d86118bce41ec0856a5d50f6c17a7e7

public class Soultion {pubilic boolean isSymmetric(TreeNode root) {Queue<TreeNode> q = new LinkedList<TreeNode>();TreeNode u = root.left;TreeNode v = root.right;if(root == null|| (u == null && v == null)){return true;}//入队q.offer(u);q.offer(v);while(!q.isEmpty()){//队列取出操作u = q.poll();v = q.poll();while (!q.isEmpty()){u = q.poll();v = q.poll();if(u == null && v == null){continue;}if((u==null|| v==null) ||(u.val! = v.val)){return false;}q.offer(u.left);q.offer(v.right);q.offer(u.right);q.offer(v.left);}return true;}}
}

二叉树最大深度算法问题

方法一:递归解决方法

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int maxDepth(TreeNode root) {if(root == null){return 0;}else{return Math.max(maxDepth(root.left),maxDepth(root.right))+1;}}
}

方法二:迭代循环方法,这里仍然用到队列

public class Soultion {public int maxDepthWithQueue(TreeNode root) {if(root == null){return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int depth = 0;while (!queue.isEmpty()) {//size记录本层的结点是否全部解决完int size = queue.size();while(size>0){TreeNode node = queue.poll();if (node.left!= null) {queue.offer(node.left);}if (node.right!= null) {queue.offer(node.right);}size--;}depth++;}return depth;}
}

一分43秒 

1-028-(LeetCode-104) 二叉树的最大深度_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1eg411w7gn?p=29&vd_source=6d86118bce41ec0856a5d50f6c17a7e7

平衡二叉树题目

什么是平衡二叉树: 一个二叉树每个结点的左右两个子树的高度差的绝对值不超过1。

用递归方式实现:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isBalanced(TreeNode root) {if(root == null){return true;}//调用递归方法return helper(root)!=-1;}public int helper(TreeNode root){if(root==null){return 0 ;}//统计左右子树的高度int left = helper(root.left);int right = helper(root.right);//比较if(left == -1 || right == -1 || Math.abs(left - right)>1){return -1;}return Math.max(left,right)+1;}
}

翻转二叉树题目

用递归的形式解题 

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode invertTree(TreeNode root) {if(root == null){return null;}//翻转根结点的左孩子invertTree(root.left);//翻转根结点的右孩子invertTree(root.right);TreeNode temp = root.left;//然后左右孩子交换root.left= root.right;root.right =temp;return root;}
}

相关文章:

  • SolidWorks官方授权代理商亿达四方带您解读最新SW版本特性
  • Java Opencv识别图片上的虫子
  • [汇总] CentOS中查询端口终止进程的指令
  • 启动mysql 3.5时出现 MySql 服务正在启动 . MySql 服务无法启动。
  • tim定时器 输入捕获模式下 TIM–ICStructinit(TIM–ICStructinit) 这个值 解析
  • C++中的结构体——结构体嵌套结构体
  • 全球5G时代,智启未来生活
  • HandyControl的属性编辑器如何绑定自定义控件,并集成到自定义编辑器
  • 接口自动化测试框架-fixture函数使用
  • 【FreeRTOS】软件定时器 software timer(上)
  • 教你一招,告警恢复时如何拿到恢复时的值?
  • 代理模式与静态代理、动态代理的实现(Proxy.newProxyInstance、InvocationHandler)
  • 网站选择定制化的优缺点
  • 我们何时才能体验到超高清?
  • Django render()函数页面渲染
  • [数据结构]链表的实现在PHP中
  • [译] React v16.8: 含有Hooks的版本
  • JavaScript函数式编程(一)
  • Javascript设计模式学习之Observer(观察者)模式
  • PHP面试之三:MySQL数据库
  • Python语法速览与机器学习开发环境搭建
  • Sequelize 中文文档 v4 - Getting started - 入门
  • VUE es6技巧写法(持续更新中~~~)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 代理模式
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 官方解决所有 npm 全局安装权限问题
  • 回顾 Swift 多平台移植进度 #2
  • 开源地图数据可视化库——mapnik
  • 深度学习在携程攻略社区的应用
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习JavaScript数据结构与算法 — 树
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (07)Hive——窗口函数详解
  • (1)STL算法之遍历容器
  • (2)STM32单片机上位机
  • (4)logging(日志模块)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Java)【深基9.例1】选举学生会
  • (SpringBoot)第七章:SpringBoot日志文件
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)EOS中账户、钱包和密钥的关系
  • (转)母版页和相对路径
  • (转载)Linux 多线程条件变量同步
  • (转载)利用webkit抓取动态网页和链接
  • ./和../以及/和~之间的区别
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .naturalWidth 和naturalHeight属性,
  • .NET 8 跨平台高性能边缘采集网关
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 连接数据库,通过数据库生成Modell
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...