当前位置:网站首页>leetcode二叉树系列(一)
leetcode二叉树系列(一)
2022-08-04 09:03:00 【你食不食油饼】
目录
1、对称二叉树
题目描述:
思路:要判断二叉树是否是对称二叉树,对称二叉树的条件大家得看清 是要root.left.right = root.right.left,我开始就吃了亏,没审清题,以为是要左节点等于左节点,右节点等于右节点;
这道题比较简单,我们直接进入代码:
public boolean isSymmetric(TreeNode root) {
return dfs(root.left,root.right);
}
public boolean dfs(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 (dfs(left.left,right.right) && dfs(left.right,right.left));
}
2、二叉树的层序遍历
题目描述:
思路:层序遍历就是遍历二叉树时,从第一层依次遍历到第二层再到第三层,与我们往常的前序、中序、后序遍历不同;
BFS(广度优先遍历),就是专门用于进行层序遍历的搜索算法,所以这道题我们会采用bfs来进行二叉树的层序遍历
代码如下:
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if (root == null) return lists;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
//size为每一层节点的个数
int size = queue.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
lists.add(list);
}
return lists;
}
3、二叉树的最大深度
题目描述:
思路:就是做一个递归操作,很简单,直接看代码
public int maxDepth(TreeNode root) {
if(root == null) return 0;
return Math.max(root.left == null ? 0 : maxDepth(root.left),
root.right == null ? 0 : maxDepth(root.right)) + 1;
}
4、从前序和中序遍历构造二叉树
题目描述:
思路: 前序遍历数组[3,9,20,15,7],中序遍历数组[9,3,15,20,7],进行递归操作
第一次递归,建立val为3的节点root,我们找到它在中序遍历数组中出现的位置,
root.left =[9],root.right = [20,15,7]
第二次递归,建立val为9的节点root,此时回退,返回root;
第三次递归,建立val为20的节点root,我们依然找到它在中序遍历数组出现的位置,
root.left = [15],root.right = [7]
第四次递归,建立val为15的节点root,此时回退,返回root;
第五次递归,建立val为7的节点root,此时回退,返回root;
第五次递归结束时,此时回退完成后,二叉树就已经建立完毕
至于我们判断回退的条件,我们可以递归参数中加入preStart、preEnd表示在前序数组中的开始索引位置和结束索引位置,当preStart == preEnd时,退出此次递归;
进入代码:
public TreeNode buildTree(int[] preorder, int[] inorder) {
LinkedHashMap<Integer,Integer> map = new LinkedHashMap<>();
return build(preorder,0,preorder.length,inorder,0,inorder.length);
}
public TreeNode build(int[] preorder,int preStart,int preEnd,int[] inorder,int inStart,int inEnd){
if(preStart == preEnd) return null;
int rootVal = preorder[preStart];
//每一个节点都是他子节点的主节点
TreeNode root = new TreeNode(rootVal);
int index = inStart;
for(;index < inEnd;index++){
if(rootVal == inorder[index])
break;
}
//移动了多少个位置才到达主节点
int leftnum = index - inStart;
root.left = build(preorder,preStart+1,preStart+leftnum+1,inorder,inStart,index);
root.right = build(preorder,preStart+leftnum+1,preEnd,inorder,index+1,inEnd);
return root;
}
持续更新中~~
边栏推荐
- binder通信实现
- [STM32] STM32F103 series name and package, memory
- 2022-08-02 分析RK817 输出32k clock PMIC_32KOUT_WIFI给WiFi模块 clock 注册devm_clk_hw_register
- TiCDC迁移-TiDB到MySQL测试
- Post-94 Byte P7 posted the salary slip: It's really good to make up for this...
- Implementation of redis distributed lock
- GBsae 8 c database using an error, how to do?
- Explanation of spark operator
- TiDB升级与案例分享(TiDB v4.0.1 → v5.4.1)
- 我和 TiDB 的故事 | 缘份在,那就终是能相遇的
猜你喜欢
Yolov5 replaces the backbone network of "Megvii Lightweight Convolutional Neural Network ShuffleNetv2"
并发编程之生产者和消费者问题
sql在字段重复时 对某个字段根据最新时间取数
DeLighT:深度和轻量化的Transformer
.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)
2022-08-02 Analyze RK817 output 32k clock PMIC_32KOUT_WIFI to WiFi module clock register devm_clk_hw_register
Explanation of spark operator
spark算子讲解
csdn图片去水印 | 其他方法无效时的解决方案
布局管理器
随机推荐
如何设计一个注册中心
三层交换机/路由器OSPF配置详解【华为eNSP实验】
DOM简述
RL学习笔记(一)
Layer 3 Switch/Router OSPF Configuration Details [Huawei eNSP Experiment]
将jpg图片转换成yuv420(NV12)数据文件
Post-94 Byte P7 posted the salary slip: It's really good to make up for this...
软件工程国考总结——判断题
How many assertion methods are commonly used in JMeter?
速速脱单诀窍
张朝阳对话俞敏洪:谈宇宙、谈焦虑、谈创业、谈退休、谈人生
telnet远程登录aaa模式详解【华为eNSP】
.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)
低代码应用开发的五大好处
去掉js代码文件所有注释
今年37了,被大厂抢着要...
下午14:00面试,14:08低着头出来了 ,问的实在是太...
94后字节P7晒出工资单:狠补了这个,真不错...
How Oracle for current library or certain library data on the same server number?
我和 TiDB 的故事 | 缘份在,那就终是能相遇的