代码随想录算法训练营,9月9日 | 二叉树递归遍历,迭代遍历,层序遍历

news/2024/9/17 13:23:10/文章来源:https://www.cnblogs.com/wowoioo/p/18405663

二叉树理论基础
1.二叉树的种类:满二叉树:深度为k,有2^k-1个节点的二叉树;完全二叉树:除最后一层外的所有层全满,而且最后一层的结点集中在最左边,中间不能空
2.二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树
3.平衡二叉搜索树:在二叉搜索树的基础上。左右子树的高度差绝对值不超过1。(题外话:HashMap/HashSet: 哈希表实现,平均时间复杂度 O(1);TreeMap/TreeSet: 红黑树实现,时间复杂度 O(log n);LinkedHashMap/LinkedHashSet: 哈希表 + 双向链表,保持插入顺序;ConcurrentHashMap: 分段锁/红黑树 + 哈希表,适用于并发场景。)
4.二叉树的存储方式:二叉树可以链式存储,也可以顺序存储(数组:i,左2i+1,右2i+2)。
5.二叉树的遍历方式:深度优先遍历:前序遍历(中左右)、中序遍历(左中右)、后序遍历(左右中);广度优先遍历:层次遍历(迭代法)
6.二叉树的定义:

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;}
}

二叉树的前序遍历
题目链接:144.二叉树的前序遍历
文档讲解︰代码随想录(programmercarl.com)
日期:2024-09-09

想法:1.递归:递归三要素:确定递归函数的参数和返回值,确定终止条件,确定单层递归的逻辑;2.迭代:递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,所以用栈来做迭代法,入栈根结点,每次取“中“位置的,再入栈右左(出栈是才能是左右)。
Java代码如下:

//递归
class Solution {public void  preOrder(TreeNode root, List<Integer> list){if(root == null){return;}list.add(root.val);preOrder(root.left, list);preOrder(root.right, list);}public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<Integer>();preOrder(root, list);return list;}
}
//迭代
class Solution {public List<Integer> preorderTraversal(TreeNode root) {Deque<TreeNode> st = new LinkedList<>();List<Integer> list = new ArrayList<>();if(root == null){return list;}st.push(root);while(!st.isEmpty()){TreeNode node = st.pop();list.add(node.val);if(node.right != null){st.push(node.right);}if(node.left != null){st.push(node.left);}}return list;}
}

总结:前序中左右,递归确定三要素,递归函数的参数和返回,递归中止条件,单层逻辑;迭代用栈来完成,想象怎么进,出的时候才能顺序正确。

二叉树的后序遍历
题目链接:145.二叉树的后序遍历
文档讲解︰代码随想录(programmercarl.com)
日期:2024-09-09

Java代码如下:

//递归
class Solution {public void postOrder(TreeNode root, List<Integer> list){if(root == null){return;}postOrder(root.left, list);postOrder(root.right, list);list.add(root.val);}public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<Integer>();postOrder(root, list);return list;}
}
//迭代
class Solution {public List<Integer> postorderTraversal(TreeNode root) {Deque<TreeNode> st = new ArrayDeque<>();List<Integer> list = new ArrayList<>();if(root == null){return list;}st.push(root);while(!st.isEmpty()){TreeNode node = st.pop();list.add(node.val);if(node.left != null){st.push(node.left);}if(node.right != null){st.push(node.right);}}Collections.reverse(list);return list;}
}

总结:后序左右中(中右左反着),跟前序很类似。

二叉树的中序遍历
题目链接:94.二叉树的中序遍历
文档讲解︰代码随想录(programmercarl.com)
日期:2024-09-09

想法:中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点,需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素
Java代码如下:

//递归
class Solution {public void inOrder(TreeNode root, List<Integer> list){if(root == null){return;}inOrder(root.left, list);list.add(root.val);inOrder(root.right, list);}public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<Integer>();inOrder(root, list);return list;}
}
//迭代
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null){return result;}Deque<TreeNode> st = new ArrayDeque<>();TreeNode cur = root;while (cur != null || !st.isEmpty()){if (cur != null){st.push(cur);cur = cur.left;}else{cur = st.pop();result.add(cur.val);cur = cur.right;}}return result;}
}

总结:中序,左中右,迭代法与前后序不一样,得先左边走到底,再中,再右。

二叉树的层序遍历
题目链接:102.二叉树的层序遍历
107.二叉树的层次遍历II
199.二叉树的右视图
637.二叉树的层平均值
429.N叉树的层序遍历
515.在每个树行中找最大值
116.填充每个节点的下一个右侧节点指针
117.填充每个节点的下一个右侧节点指针II
104.二叉树的最大深度
111.二叉树的最小深度
文档讲解︰代码随想录(programmercarl.com)
日期:2024-09-09

想法:
Java代码如下:


总结:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794757.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WRF设置模式垂直层

翻译自WRF论坛https://forum.mmm.ucar.edu/threads/stretched-vertical-levels-information.14975/#post-37729设置模式垂直层​ Eta 层由 real 自动计算,基于namelist选项“e_vert.”所设置的层数。然而,完整的eta 层次可以由namelist选项“eta_levels.”来显式的指定。层次…

3.MR

MR一.MR概述1.mr定义Mr是一个分布式运算程序的编程框架,是用户开发”基于hadoop的数据分析应 用”的核心框架Mr核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整地 分布式运算程序,并发运行在一个hadoop集群上2.mr优缺点2.1.优点(1)易于编程.用户只关心业务逻辑…

4.MR(1)

2.mapreduce工作流程流程一流程二3.shuffle3.1.shuffle机制map方法之后,reduce方法之前的数据处理过程称之为shuffle3.2.分区3.3.writablecomparable排序(1)排序概述(2)排序分类3.4.combiner合并

5.MR(2)

4.输出数据outputformat接口实现类5.mapreduce内核源码解析5.1.maptask工作机制(1)read阶段:maptask通过inputformat获得的recordreader,从输出 inputsplit中解析一个个key/value5.2.reducetask工作机制5.3.reducetask并行度决定机制6.join6.1.reduce join6.2.map join7.数据清…

南京某大学入门知识

某大学入门知识一家之言,不必在意。 某高校文档镇楼https://github.com/SurviveSJTU/SurviveSJTUManual 地图 雷丁楼 楼主参加融媒体中心报名时,去过一次,其他时候没去过(雷丁学院,类似于与国外合作的专业) 东苑体育场 有体育馆,有室内羽毛球(二楼),击剑(二楼),健…

Python用MarkovRNN马尔可夫递归神经网络建模序列数据t-SNE可视化研究

原文链接:https://tecdat.cn/?p=37634 原文出处:拓端数据部落公众号 本文聚焦于利用马尔可夫递归神经网络(MarkovRNN)结合树库展开建模工作。MarkovRNN 通过整合马尔可夫特性与离散随机变量来深入探索递归神经网络中的随机转换机制,旨在高效处理具有复杂潜在信息的高度结…

CUDA

1、GPU准备 1、查看GPU类型 GeForce RTX 30602、查看算力https://en.wikipedia.org/wiki/CUDA#GPUs_supported算力8.63、确定CUDA Runtime 支持的CUDA SDK为11.1-12.54、查看驱动的Driver Version CUDA Version 为12.3所以适用的CUDA 11.1-12.3 2、更新显卡驱动 1、下载了最新显…

碳酸锂 短线

大周期:3分钟短线:

【LLM训练系列】从零开始训练大模型之Phi2-mini-Chinese项目解读

一、前言 本文主要是在复现和实践Phi2-mini-Chinese后,简要分析下Phi2-mini-Chinese这个项目,做一个学习实战总结。 原文发布于知乎:https://zhuanlan.zhihu.com/p/718307193,转载请注明出数。 Phi2-mini-Chinese简介 Phi2-Chinese-0.2B 从0开始训练自己的Phi2中文小模型,…

第20篇 window系统安装Redis流程

1.下载 Redis for Windows Redis 官方并没有提供 Windows 版本的安装包,但你可以使用 Microsoft 维护的 Windows 版本的 Redis。你可以从以下链接下载 Redis for Windows:2.安装 Redis 运行安装程序: 双击下载的 .msi 文件,启动安装程序。 按照安装向导的提示进行安装。这里…

C++顺序结构(1)任务

1、下载并观看视频(照着做,多看几遍) https://www.jianguoyun.com/p/DWCNkNEQi8_wDBj5ptYFIAA 2、两项照着做的任务

xlam插件制作实验手册

大家来和笔者一起做一个xlam插件吧。很简单,很详细。 楔子excel支持自定义菜单栏,但是我在搜索如何制作菜单栏,以及如何制作addin文件的时候,即使是最好的例子,也只是点到为止,做了一个按钮就结束了。想要再进一步,竟然就没有合适的二手资料了。所以自然笔者就决定自己补…