二叉树为空意味着二叉树_不怕面试被问了!二叉树算法大盘点

作者 | BoCong-Deng

题图 | 视觉中国

出品 | CSDN博客

树结构对于程序员来说应该不陌生,特别是二叉树,基本只要接触算法这一类的都一定会碰到的,所以我打算通过一篇文章,对二叉树结构的相关算法进行总结汇总,思路和代码实现相结合,让你不在惧怕二叉树。(ps:后面我还想写一篇树结构的高级篇,就是多叉数,就是对我平时看算法论文碰到的一些新奇的算法,比如B树、B+树,还有我一种叫做Bed树的新奇算法等等)

单纯就是想分享技术博文,还想说一句就是,如果觉得有用,请点个关注、给个赞吧,也算对我来说是个宽慰,毕竟也得掉不少头发,嘿嘿嘿。

下面的思路讲解中,我会给出一个类伪代码的思路,然后进行相关说明,也就是一种思路框架,有了思路框架,以后碰到问题就直接交给框架完成。本文主要说一下二叉搜索树(Binary Search Tree,简称 BST),BST是一种很常用的的二叉树。它的定义是:一个二叉树中,任意节点的值要大于等于左子树所有节点的值,且要小于等于右边子树的所有节点的值。如下就是一个符合定义的 BST:

后面如果遇到特殊的思路结构,如多叉树,我会特别说明。首先我们先给出二叉树的节点定义(这个定义应该不陌生吧,有刷算法题都会碰到)。

public class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode(int x) { val = x; }

}

递归

不过这里要说明一点的是,在伪代码中的“进行想要的操作”的位置,不一定就在我放置的位置,具体位置还需要我们根据不同的实际需求进行判断。不过因为前中后序的遍历,递归进入的时机应该需要和我的一样。

先序遍历

遍历根节点,如果根节点为空,返回;否则,遍历根节点,然后先序遍历左子树,再先序遍历右子树。

public void preorderTraverse(TreeNode root){
System.out.print(node.val+" ");
preorderTraverse(root.left);
preorderTraverse(root.right);
}

中序遍历

路过根节点,如果根节点为空,返回;否则,中序遍历左子树,然后遍历根节点,再中序遍历右子树。

public void inorderTraverse(TreeNode root){
inorderTraverse(root.left);
System.out.print(node.val+" ");
inorderTraverse(root.right);
}

后序遍历

路过根节点,如果根节点为空,返回;否则,后序遍历左子树,再后序遍历右子树,最后遍历根节点。

public void postorderTraverse(TreeNode root){
postorderTraverse(root.left);
postorderTraverse(root.right);
System.out.print(node.val+" ");
}

迭代(非递归)

我们使用迭代的思想,其实就是利用循环和栈来模拟递归的操作,上面递归的操作,其实就是一个不断将自己以及左右子节点进行压栈和出栈的过程,如果理解了上面的算法下面的算法就好理解了

前序遍历

public List preorderTraversal(TreeNode root) {
List list = new ArrayList<>;
if(root==){
return list;
}
Stack stack = new Stack<>;
stack.push(root);
while(!stack.isEmpty){
TreeNode res = stack.pop;
if(res.right != )
stack.push(res.right);
if(res.left != )
stack.push(res.left);
list.add(res.val);
}
return list;
}

中序遍历

public List inorderTraversal(TreeNode root) {
List list = new ArrayList<>;
if(root==){
return list;
}
Stack stack = new Stack<>;
TreeNode curr = root;
while(curr != || !(stack.isEmpty)){
if(curr!= ){
stack.push(curr);
curr = curr.left;
}else{
curr = stack.pop;
list.add(curr.val);
curr = curr.right;
}
}
return list;
}

后序遍历

我们可以很简单的实现另一种遍历:”根->右->左“遍历。虽然这种遍历没有名字,但是他是后序遍历的反序。所以我们可以利用两个栈,利用栈的LIFO特点,来实现后续遍历。

public List preorderTraversal(TreeNode root) {
List list = new ArrayList<>;
if(root==){
return list;
}
Stack stack = new Stack<>;
stack.push(root);
while(!stack.isEmpty){
TreeNode res = stack.pop;
if(res.left != )
stack.push(res.left);
if(res.right != )
stack.push(res.right);
list.add(res.val);
}
list.reserve;
return list;
}

深度优先搜索(DFS)

其实,二叉树的先序遍历,中序遍历,后序遍历,都是深度优先搜索,深搜是一种思想,并不具体指代实现方式,你可以使用递归,也可以使用栈来实现,所以上面提到的都是深度优先搜索的实现方式,毕竟“深度优先”嘛。

那在这里我就是提几个实际的应用的例子,加深一下印象。

二叉树的最大深度

public int maxDepth(TreeNode root) {
if(root==){
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return Math.max(left,right)+1;
}

二叉树的镜像

public void Mirror(TreeNode root) {
if(root!=){
if(root.left!= || root.right!= ){
TreeNode temp =root.left;
root.left=root.right;
root.right=temp;
}
Mirror(root.left);
Mirror(root.right);
}
}

对称二叉树

boolean isSymmetrical(TreeNode pRoot){
if(pRoot == )
return true;
return real(pRoot.left,pRoot.right);
}
public boolean real(TreeNode root1,TreeNode root2){
if(root1 == && root2 == ){
return true;
}
if(root1 == || root2 == ){
return false;
}
if(root1.val != root2.val){
return false;
}
return real(root1.left,root2.right)&&real(root1.right,root2.left);
}

路径总和

public class Solution {
private ArrayList list = new ArrayList;
private ArrayList> listAll = new ArrayList>;
public ArrayList> FindPath(TreeNode root,int target) {
if(root == )
return listAll;
list.add(root.val);
target -= root.val;
if(target == 0 && root.left== && root.right == ){
listAll.add(new ArrayList(list));
}
FindPath(root.left,target);
FindPath(root.right,target);
list.remove(list.size-1);
return listAll;
}
}

重建二叉树

public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
return reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
}
public TreeNode reConstructBinaryTree(int [] pre,int startpre,int endpre,int [] in,int startin,int endin){
if(startpre > endpre || startin > endin){
return ;
}
TreeNode root = new TreeNode(pre[startpre]);
for(int i =startin;i<=endin;i++){
if(in[i] == pre[startpre]){
root.left = reConstructBinaryTree(pre,startpre+1,startpre+i-startin,in,startin,i-1);
root.right = reConstructBinaryTree(pre,startpre+i-startin+1,endpre,in,i+1,endin);
}
}
return root;
}

二叉搜索树的最近公共祖先

class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == || root == p || root == q){
return root;
}
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left!= && right!=){
return root;
}
return left!=?left:right;
}
}

二叉树的序列化和反序列化

序列化:
public String serialize(TreeNode root) {
if (root == ) {
return ;
}
// 利用二叉树的层次遍历方式进行序列化
StringBuilder res = new StringBuilder;
LinkedList queue = new LinkedList<>;
queue.add(root);
while (!queue.isEmpty) {
TreeNode node = queue.remove;
if (node != ) {
res.append(node.val).append(

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

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

相关文章

android 开发环境以及hello world,Android Studio开发环境搭建和HelloWorld

先下一个Pie吧然后发现run的位置是灰色的&#xff0c;而且这个Add Configuration没有下拉列表我去百度了一下这个问题&#xff0c;它让我在下拉列表里找APP???百度上面没有找到关于这个的解答&#xff0c;我就想是不是我的安装包出问题了&#xff0c;于是我就卸了重新装彻底…

基于jsp+mysql+Spring+hibernate+在线学习交流论坛平台

本项目演示链接地址 》 主要功能模块设计&#xff1a; 管理员角色包含以下功能&#xff1a;管理员登录,发布公告,修改资料,查看新帖,查看精华帖请求,封锁用户,创建讨论区等功能。 用户角色包含以下功能&#xff1a;按分类查看,用户登录,查看帖子详情,查看我的帖子,提交帖子,资料…

基于jsp+Spring+mybatis的SSM企业门户网站设计和实现

本项目演示链接地址 》 前言 人类社会已经迈入了21世纪&#xff0c;信息技术的浪潮也冲击着社会的方方面面。以计算机互联网为核心的科学技术为社会各行各业提供了前所未有的机会和发展潜力。生产业也不例外。互联网走到今天&#xff0c;也有五年的光景了&#xff0c;之间经历了…

html+字体图标找不到字体,bootstrap中不显示字体图标问题怎么解决?

bootstrap中不显示字体图标的原因是什么&#xff1f;怎么解决&#xff1f;下面本篇文章给大家介绍一下。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。你在使用bootstrap字体图标的时候&#xff0c;是否遇到引用本地Bootstrap文件无法…

buffsize 缓冲区的大小多少合适_对于Redis性能指标监控!你了解多少?

监控指标性能指标&#xff1a;Performance内存指标: Memory基本活动指标&#xff1a;Basic activity持久性指标: Persistence错误指标&#xff1a;Error监控方式redis-benchmarkredis-statredis-fainaredisliveredis-climonitorshowlog1.get&#xff1a;获取慢查询日志2.len&am…

java怎么确定数据在区间内_处理数据时,单元格内内容太多无法计数怎么破?...

在职场办公中&#xff0c;处理数据时有时会遇到古里古怪的数据源&#xff0c;比如从系统导出来的或是表哥表弟们录入数据的不规范。从而使得后续处理起来比较棘手。规范数据源很重要&#xff01;话不多说&#xff0c;先来看看今天要分享的案例&#xff1a;每个订单下有多种物料…

html调用app store,iOS 获取appStore的链接地址,从app中跳转 appStore中应用

从app中跳转到appStore中&#xff0c;分为1.取得app在appStore中的链接地址mac打开iTunes,在右上角中的搜索框中输入你的应用名称。在弹出的菜单中&#xff0c;选择复制链接&#xff0c;得到该应用的链接地址&#xff1a;https://itunes.apple.com/cn/app/jie-zou-da-shi/id493…

上下级平台之间数据同步方案_Alluxio与底层存储系统之间的元数据同步机制

请点击上方蓝字&#xff0c;关注我们哦&#xff01;作者简介&#xff1a;林意群&#xff0c;Apache Hadoop PMC member&#xff0c;Apache Ozone PMC member&#xff0c;拥有多年参与开源社区经验&#xff0c;主要专注于存储领域的研究和学习&#xff0c;目前任eBay Hadoop tea…

python3dijkstra_python3 实现Dijkstra(迪杰斯特拉)最短路径算法

Dijkstra单源最短路径算法&#xff0c;用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展&#xff0c;直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法&#xff0c;在很多专业课程中都作为基本内容有详细的介绍&#xff0c;如数据…

基于java SSM图书管理系统简单版设计和实现

本项目演示链接地址 》 主要技术&#xff1a;后台采用技术&#xff1a; SSM框架(SpringMVC Spring Mybatis) 前台采用技术&#xff1a; div css 功能比较简单、适合学习使用 主要功能&#xff1a;登录、图书类型添加、图书类型列表、编辑和删除、图书上传。图书列表、导出…

樊登读书会终身成长读后感_终身成长读后感

当我们还是婴儿时&#xff0c;我们学习走路、说话&#xff0c;跌倒了、说错了&#xff0c;不会害怕和丢脸。后来&#xff0c;我们懂得了更多&#xff0c;反而怕这怕那&#xff0c;止步不前了。为什么呢&#xff1f;因为我们转变了思维模式。《终身成长》一书中提出了人的思维是…

html中的行内标签吗,HTML标签中行内元素和块级元素详解

本文主要和大家详细介绍了HTML常用的标签中行内元素和块级元素&#xff0c;需要的朋友参考下吧&#xff0c;希望能帮助到大家。块元素(block element) HTML标签分类明细* address - 地址* blockquote - 块引用* center - 举中对齐块* dir - 目录列表* p - 常用块级容易&#xf…

基于javaweb jsp+servlet学生宿舍管理系统设计和实现

本项目演示链接地址 》 主要技术&#xff1a;spring、jsp、servlet、mysql、tomcat 、jsp、jquery、css、c390 、cookie、session等基本技术实现 主要功能:不同角色登录、宿舍管理员管理、学生信息管理、宿舍信息管理、学生缺勤管理、修改密码和退出功能。 系统功能截图&…

html泰勒展开,【转载】泰勒展开式

泰勒展开式对于利用FPGA实现算法来说非常实用&#xff0c;可以将除法等对硬件不友好的运算转变为乘加操作。特此转载以下博文&#xff0c;原文标题及链接为&#xff1a;泰勒展开式 - guoxiang - 博客园https://www.cnblogs.com/guo-xiang/p/6662881.html数学中&#xff0c;泰勒…

rgba通道转rgb_将RGBA颜色转换为RGB

潇潇雨雨这是一些Java代码(适用于Android API 24)&#xff1a; //int rgb_background Color.parseColor("#ffffff"); //white background //int rgba_color Color.parseColor("#8a000000"); //textViewColor int defaultTextViewC…

基于Java Swing五子棋小游戏设计和实现

本项目演示链接地址 》 前言: 五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。 在上古的神话传说中有“女…

ueditor工具栏弹出html,UEditor工具栏上自定义按钮、图标、事件、窗口页面

第一步&#xff1a;找到editor_config.js(或者ueditor.config.js)文件中的toolbars参数&#xff0c;增加一个“camnpr”字符串&#xff0c;对应着添加一个labelMap&#xff0c;用于鼠标移上按钮时的提示。1toolbars:[2[...,searchreplace,help,camnpr]3],4labelMap:{5anchor:,u…

junit 单元测试报错java.lang.NoClassDefFoundError

查看版本 junit-4.11以上版本不在包含hamcrest。 解决方法&#xff1a; 下载 junit-4.11以下版本或下载hamcrest-core-1.3.jar驱动包

aps后缀是什么文件_APS审核真的取消了么?

今天早上&#xff0c;留德朋友圈被一条看似惊人的消息刷爆了&#xff1a;APS审核取消了。从早上8点开始&#xff0c;老狗微信的提示音就没有消停过&#xff0c;很多学生抱着同样的问题过来询问&#xff1a;老师&#xff0c;APS是不是真的取消了&#xff1f;我马上爬了起来&…

用计算机探索规律反思,用计算器探索规律教学反思

用计算器探索规律教学反思一:本课时主要引导学生借助计算器探索积得一些变化规律和商不变的规律,以及运用这些规律进行简便计算和解决一些简单的实际问题,在学习这部分内容之前,学生已经学习了整数乘、除法和使用计算器进行计算,有了一定的学习基础.因此,重点应放在对规律的探索…