【算法】TOP101-二叉树篇(持续更新ing)

文章目录

  • 1. JZ36 二叉搜索树与双向链表
  • 2. 100. 相同的树
  • 3. 572. 另一棵树的子树
  • 4. BM26 求二叉树的层序遍历
  • 5. BM33 二叉树的镜像
  • 6. BM40 重建二叉树
  • 7. 106. 从中序与后序遍历序列构造二叉树

1. JZ36 二叉搜索树与双向链表

JZ36 二叉搜索树与双向链表
在这里插入图片描述
解题思路:
由题目可知,这是一颗二叉搜索树.二叉搜索树的特点就是他的中序遍历是有序的.所以本题我们大的框架就是要在中序遍历里完成.具体解题如下:
在这里插入图片描述
代码:

/**
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}
*/
public class Solution {public TreeNode Convert(TreeNode pRootOfTree) {if(pRootOfTree == null){return null;}TreeNode head = pRootOfTree;convertChild(head);while(head.left != null){head = head.left;}return head;}public static TreeNode prev = null;public static void convertChild(TreeNode pCur){if(pCur == null){return;}convertChild(pCur.left);pCur.left = prev;if(prev != null){prev.right = pCur;}prev = pCur;convertChild(pCur.right);}
}

2. 100. 相同的树

100. 相同的树
在这里插入图片描述
解题思路:
要想判断两颗二叉树是否相同,那么就要从两个方面去考虑:

  1. 二叉树的结构
  2. 二叉树的值

本题我们采用递归的思想,则代码如下:

/*** 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 isSameTree(TreeNode p, TreeNode q) {//如果两棵树都为空,则相同if(p == null && q == null){return true;}//如果两颗树其中一颗为空,则不同if(p != null && q == null || p == null && q!= null){return false;}if(p.val != q.val){return false;}return isSameTree(p.left,q.left)&& isSameTree(p.right,q.right);}
}

3. 572. 另一棵树的子树

572. 另一棵树的子树
在这里插入图片描述
解题思路:
想要判断一棵树是不是另一颗树的子树,我们可以采用递归的思想.先判断子树是不是这棵树的左树,在判断是不是这棵树的右树.要是都不是,则这棵子树不是树的子树.则有以下代码:

/*** 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 isSubtree(TreeNode root, TreeNode subRoot) {if(root== null){return false;}if(isSameTree(root,subRoot)){return true;}if(isSameTree(root.left,subRoot)){return true;}if(isSameTree(root.right,subRoot)){return true;}return false;}public boolean isSameTree(TreeNode p, TreeNode q) {//如果两棵树都为空,则相同if(p == null && q == null){return true;}//如果两颗树其中一颗为空,则不同if(p != null && q == null || p == null && q!= null){return false;}if(p.val != q.val){return false;}return isSameTree(p.left,q.left)&& isSameTree(p.right,q.right);}
}

4. BM26 求二叉树的层序遍历

BM26 求二叉树的层序遍历
在这里插入图片描述
解题思路:
在这里插入图片描述

import java.util.*;/** public class TreeNode {*   int val = 0;*   TreeNode left = null;*   TreeNode right = null;*   public TreeNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param root TreeNode类 * @return int整型ArrayList<ArrayList<>>*/public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {// write code here//先创建一个ListList列表用来存放ArrayList<ArrayList<Integer>> list = new ArrayList<>();if(root == null){return list;}Queue<TreeNode> qu = new LinkedList<>();qu.offer(root);while(!qu.isEmpty()){int size = qu.size();ArrayList<Integer> tmp = new ArrayList<>();while(size > 0){TreeNode cur = qu.poll();size--;tmp.add(cur.val);if(cur.left != null){qu.offer(cur.left);}if(cur.right != null){qu.offer(cur.right);}}list.add(tmp);}return list;}
}

5. BM33 二叉树的镜像

BM33 二叉树的镜像
在这里插入图片描述
解题思路:
本题我们采用子问题的思路.根据二叉镜像树的特点.我们可以看出来我们需要交换每一个根的左右节点.在代码中我们可以先递归左子树,然后让它的子节点交换,再递归右子树(此时代码中书写的仍然是左,因为在上述交换过程中已经交换了).代码如下:

import java.util.*;/** public class TreeNode {*   int val = 0;*   TreeNode left = null;*   TreeNode right = null;*   public TreeNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pRoot TreeNode类 * @return TreeNode类*/public TreeNode Mirror (TreeNode root) {// write code hereif(root == null){ return null;}Mirror(root.left);TreeNode tmp = root.left;root.left = root.right;root.right = tmp;Mirror(root.left);return root;}
}

6. BM40 重建二叉树

BM40 重建二叉树
在这里插入图片描述
解题思路:根据前序遍历和中序遍历的特点,我们可以知道前序遍历的第一个字符"1"为二叉树的根.我们需要在中序遍历中找到"1"的位置,然后1的左边为左子树,"1"的右边为右子树.按照以上的思想,我们可以通过前序遍历和中序遍历构建出这棵树,如下所示:
在这里插入图片描述
代码具体实现如下:

import java.util.*;/** public class TreeNode {*   int val = 0;*   TreeNode left = null;*   TreeNode right = null;*   public TreeNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param preOrder int整型一维数组 * @param vinOrder int整型一维数组 * @return TreeNode类*/public int preIndex = 0;public TreeNode reConstructBinaryTree (int[] preorder, int[] inorder) {// write code herereturn buildTree(preorder,inorder,0,inorder.length-1);}// preorder:前序遍历数组下标// inbegin:中序遍历的首部// inend:中序遍历的结束private TreeNode buildTree(int[] preorder,int[] inorder,int inbegin,int inend){// 1.判断当前根结点是不是还有左子树或者右子树if(inbegin > inend){return null;}TreeNode root = new TreeNode(preorder[preIndex]);// 2.找到root在中序遍历的位置int rootIndex = findIndex(inorder,inbegin,inend,preorder[preIndex]);preIndex++;if(rootIndex == -1){return null;}// 构建左子树和右子树root.left = buildTree(preorder,inorder,inbegin,rootIndex-1);root.right = buildTree(preorder,inorder,rootIndex+1,inend);return root;}private int findIndex (int[] inorder,int inbegin,int inend,int val) {for(int i = inbegin;i <= inend;i++) {if(inorder[i] == val) {return i;}}return -1;}
}

7. 106. 从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树
在这里插入图片描述
解题思路:本题的思路与上述第六题使用前序遍历和中序遍历重建二叉树的思路是类似的.但是需要注意的是后序遍历的顺序是左右根.所以创建树的顺序就是 根->右子树->左子树.我们只需要改一下代码的顺序.具体代码的实现如下:

/*** 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 postIndex = 0;public TreeNode buildTree(int[] inorder, int[] postorder) {// write code herepostIndex = postorder.length-1;return buildTree(postorder,inorder,0,inorder.length-1);}// postorder:后序遍历数组下标// inbegin:中序遍历的首部// inend:中序遍历的结束private TreeNode buildTree(int[] postorder,int[] inorder,int inbegin,int inend){// 1.判断当前根结点是不是还有左子树或者右子树if(inbegin > inend){return null;}TreeNode root = new TreeNode(postorder[postIndex]);// 2.找到root在后序遍历的位置int rootIndex = findIndex(inorder,inbegin,inend,postorder[postIndex]);postIndex--;if(rootIndex == -1){return null;}// 构建右子树和左子树root.right = buildTree(postorder,inorder,rootIndex+1,inend);root.left = buildTree(postorder,inorder,inbegin,rootIndex-1);return root;}private int findIndex (int[] inorder,int inbegin,int inend,int val) {for(int i = inbegin;i <= inend;i++) {if(inorder[i] == val) {return i;}}return -1;}
}

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

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

相关文章

【uniapp/uView】解决消息提示框悬浮在下拉框之上

需要实现这样的效果&#xff0c;即 toast 消息提示框在 popup 下拉框之上&#xff1a; 解决方法&#xff0c;把 <u-toast ref"uToast" /> 放在 u-popup 里面即可&#xff0c;这样就可以提升 toast 的优先级&#xff1a; <!-- 弹出下拉框 --><u-popu…

MySQL数据的基础语法

MySQL 是一种强大的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用 SQL&#xff08;Structured Query Language&#xff09;来管理和操作数据。以下是 MySQL 数据库的基础 SQL 语法&#xff0c;包括创建数据库、创建表、插入、查询、更新和删除数据等基…

大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求

大规模语言LLaVA&#xff1a;多模态GPT-4智能助手&#xff0c;融合语言与视觉&#xff0c;满足用户复杂需求 一个面向多模式GPT-4级别能力构建的助手。它结合了自然语言处理和计算机视觉&#xff0c;为用户提供了强大的多模式交互和理解。LLaVA旨在更深入地理解和处理语言和视…

自然语言处理---Transformer机制详解之Decoder详解

1 Decoder端的输入解析 1.1 Decoder端的架构 Transformer原始论文中的Decoder模块是由N6个相同的Decoder Block堆叠而成&#xff0c;其中每一个Block是由3个子模块构成&#xff0c;分别是多头self-attention模块&#xff0c;Encoder-Decoder attention模块&#xff0c;前馈全…

web前端基础CSS------美化页面“footer”部分

一&#xff0c;实验代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>关于我们</title><style type"text/css">#footer{margin: 10px 0px;background: #f5f5f5;border: top 1px solid #eee ;}#f…

redis 缓存雪崩 缓存击穿 缓存穿透

目录 redis 缓存雪崩 && 缓存击穿 && 缓存穿透 什么是缓存雪崩 缓存雪崩的成因如何预防缓存雪崩什么是缓存穿透&#xff1f; 导致缓存穿透的原因缓解缓存穿透的方法什么是缓存击穿&#xff1f; 缓存穿透与缓存击穿的区别缓存击穿的原因解决缓存击穿问题文章转自…

NET7下用WebSocket做简易聊天室

NET7下用WebSocket做简易聊天室 步骤&#xff1a; 建立NET7的MVC视图模型控制器项目创建websocket之间通信的JSON字符串对应的实体类一个房间用同一个Websocketwebsocket集合类&#xff0c;N个房间创建websocket中间件代码Program.cs中的核心代码&#xff0c;使用Websocket聊…

NRK3301语音芯片在智能窗帘上的应用

窗帘是人们日常生活中所经常使用的家居产品&#xff0c;传统的窗帘大多都需要手动拉动窗帘使用&#xff1b;存在着拉拽费劲&#xff0c;挂钩容易掉落等问题。随着数字化转型的升级&#xff0c;推进了窗帘市场的高质量发展。智能窗帘也“适时出现”出现了&#xff0c;一款带有语…

[python 刷题] 287 Find the Duplicate Number

[python 刷题] 287 Find the Duplicate Number 题目&#xff1a; Given an array of integers nums containing n 1 integers where each integer is in the range [1, n] inclusive. There is only one repeated number in nums, return this repeated number. You must sol…

实现Traefik工具Dashboard远程访问:搭建便捷的远程管理平台

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

wireshark 中无线帧的类型和过滤规则对照表

帧类型 过滤器语法 Management frame wlan.fc.type 0 Control frame wlan.fc.type 1 Data frame wlan.fc.type 2 Association request wlan.fc.type_subtype 0x00 Association response wlan.fc.type_subtype 0x01 Reassociation request wlan.fc.type_subty…

html5 web 按钮跳转方法(及其相关)

html5 web 按钮跳转方法&#xff08;及其相关&#xff09; 方法一 <a href"javascript:" οnclick"history.go(-2); ">返回前两页</a> 方法二 <a href"javascript:" οnclick"self.locationdocument.referrer;">返…

wireshark数据包内容查找功能详解

wireshark提供通过数据包特征值查找具体数据包的功能&#xff0c;具体查找功能如下&#xff0c; &#xff08;1&#xff09;选择查找目标区域&#xff08;也就是在哪里去匹配特征值&#xff09; 如下图&#xff0c;【分组列表】区域查找指的是在最上方的数据包列表区域查找&…

【Pillow库的内涵】01/3 进行基本图像操作

一、说明 Pillow 具有被 Python 社区广泛使用的优势&#xff0c;并且它不像其他一些图像处理库那样具有陡峭的学习曲线。应用PIL库的Image对象&#xff0c;益处很多&#xff0c;首先它可以处理网上URL文件&#xff0c;其次&#xff0c;图片可以方面转化成int32、64或float类型&…

自然语言处理---huggingface平台使用指南

1 huggingface介绍 Huggingface总部位于纽约&#xff0c;是一家专注于自然语言处理、人工智能和分布式系统的创业公司。他们所提供的聊天机器人技术一直颇受欢迎&#xff0c;但更出名的是他们在NLP开源社区上的贡献。Huggingface一直致力于自然语言处理NLP技术的平民化(democr…

源码解析flink的GenericWriteAheadSink为什么做不到精确一次输出

背景 GenericWriteAheadSink是可以用于几乎是精准一次输出的场景&#xff0c;为什么说是几乎精准一次呢&#xff1f;我们从源码的角度分析一下 GenericWriteAheadSink做不到精准一次输出的原因 首先我们看一下flink检查点完成后通知GenericWriteAheadSink开始进行分段的记录…

设计模式:组合模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

简介&#xff1a; 组合模式&#xff0c;它是一种用于处理树形结构、表示“部分-整体”层次结构的设计模式。它允许你将对象组合成树形结构&#xff0c;以表示部分和整体的关系。这种模式的主要目的是简化客户端代码&#xff0c;并使客户端以一致的方式处理单个对象和组合对象。…

CSS基本讲解与使用(详解)

什么是CSS: CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于定义网页元素外观和样式的标记语言。它是一种用于将结构化文档&#xff08;通常是HTML和XML&#xff09;的外观和排版从内容的标记中分离出来的技术。CSS的主要目标是将网页的呈…

iOS Flutter Engine源码调试和修改

iOS Flutter Engine源码调试和修改 1. 前提:2. 步骤&#xff1a;3. 参考资料 1. 前提: 已将成功安装deop_tools工具已经通过gclient命令同步好flutter engine源码 2. 步骤&#xff1a; 进入engine/src目录 创建flutter engine构建文件 真机文件debug模式&#xff1a; ./flu…

网络知识基础一

1.HTTP相应的结构是怎么样的? HTTP响应由三个部分组成: 1:状态码(Status Code):描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。 2:…