【Java数据结构 -- 二叉树有关面试OJ题2】

二叉树OJ面试题

  • 1. 对称二叉树
  • 2.二叉树的构建及遍历
  • 3.二叉树的层序遍历
  • 4.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先
  • 5. 二叉树创建字符串
  • 用栈来存放路径上的节点

1. 对称二叉树

思路:

  1. 在根的值一样接着往下判断
  2. 判断左树的左子树的值和右树的右子树的值是否相同
  3. 判断左树的右子树的值和右树的左子树的值是否相同
    public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}return isSymmetricChild(root.left,root.right);}private boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree){if (leftTree == null && rightTree == null) {return true;}if ((leftTree == null && rightTree != null) || (leftTree != null && rightTree == null)) {return false;}if (leftTree.val != rightTree.val) {return false;}return isSymmetricChild(leftTree.left, rightTree.right) &&isSymmetricChild(leftTree.right , rightTree.left);}

2.二叉树的构建及遍历

要求:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

import java.util.Scanner;
class TreeNode {public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}
}// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static int i = 0;public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNextLine()) {String str = in.nextLine();TreeNode root = createTree(str);inorder(root);}}public static TreeNode createTree(String str) {//1.遍历字符串strTreeNode root = null;if(str.charAt(i) != '#') {//2.根据前序遍历创建二叉树root = new TreeNode(str.charAt(i));i++;root.left = createTree(str);root.right = createTree(str);}else {i++;}//3.返回根节点return root;}public static void inorder(TreeNode root) {if (root == null) {return;}inorder(root.left);System.out.print(root.val + " ");inorder(root.right);}
}

3.二叉树的层序遍历

层序遍历:按照从上到下,从左到右的顺序来访问每一层的节点
思路:**利用队列的先进先出的思想,先从根节点出发,将其压入队列中,接着判断从队列中弹出来的节点的左右孩子;若该节点的左孩子不为null时,将其压入队列。一直循环,当队列为空时,说明已经把该树遍历完了。

/*** 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;*     }* }*/public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ret = new ArrayList<>();if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();List<Integer> tmp = new ArrayList<>();// 层序遍历while (size != 0){TreeNode cur = queue.poll();//System.out.print(cur.val+" ");tmp.add(cur.val);size--;if (cur.left != null){queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}}ret.add(tmp);}return ret;}
    void levelOrder(TreeNode root) {if (root == null) {return;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {// 层序遍历TreeNode cur = queue.poll();System.out.print(cur.val+" ");if (cur.left != null){queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}}}

4.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先

思路:root还是在遍历这棵树,遇到p或者q就返回

  1. 如果root节点是p或者是q 那么root是最近祖先
  2. 如果pq分布在root的左右两侧,那么root就是最近祖先
  3. pq在root的同一侧 遇到的第一个就是公共祖先,即左边不为空,右部为空 或者左空,右不空
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null){return null;}if (root == p || root == q){return root;}// 递归左树或者右树TreeNode leftTree = lowestCommonAncestor(root.left,p,q);TreeNode rightTree = lowestCommonAncestor(root.right,p,q);if (leftTree != null && rightTree != null) {return root;}else if (leftTree != null) {return leftTree;}else {return rightTree;}}

5. 二叉树创建字符串

思路:

  1. 根节点直接拼接
  2. 左边为空 && 右空 直接返回
  3. 左边不为空,右边为空,加“(”
  4. 左边为空,右边不为空 直接加一对括号“()”
    public String tree2str(TreeNode root) {StringBuilder stringBuilder = new StringBuilder();tree2strChild(root,stringBuilder);return stringBuilder.toString();}private void tree2strChild(TreeNode t, StringBuilder stringBuilder){if (t == null) {return;}stringBuilder.append(t.val);if (t.left != null) {stringBuilder.append("(");tree2strChild(t.left,stringBuilder);stringBuilder.append(")");}else {if (t.right == null) {return;}else {stringBuilder.append("()");}}// 判断右树if (t.right != null) {stringBuilder.append("(");tree2strChild(t.right,stringBuilder);stringBuilder.append(")");}else {return;}}

用栈来存放路径上的节点

    public TreeNode lowestCommonAncestor2(TreeNode root, TreeNode p, TreeNode q) {if(root == null) return null;Stack<TreeNode> stackP = new Stack<>();Stack<TreeNode> stackQ = new Stack<>();getPath(root,p,stackP);getPath(root,q,stackQ);int sizeP = stackP.size();int sizeQ = stackQ.size();if(sizeP > sizeQ) {int size = sizeP - sizeQ;while(size != 0) {stackP.pop();size--;}}else {int size = sizeQ - sizeP;while(size != 0) {stackQ.pop();size--;}}//两个栈当中的元素是一样多while(!stackP.isEmpty() && !stackQ.isEmpty()) {if(stackP.peek() == stackQ.peek()) {return stackP.peek();}else{stackP.pop();stackQ.pop();}}return null;}//判断左树没有这个节点 右树没有这个节点 那么当前的root就不是路径上的节点private boolean getPath(TreeNode root,TreeNode node,Stack<TreeNode> stack) {if(root == null || node == null) {return false;}stack.push(root);if(root == node) {return true;}boolean flg = getPath(root.left,node,stack);if(flg) {return true;}boolean flg2 = getPath(root.right,node,stack);if(flg2) {return true;}stack.pop();return false;}

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

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

相关文章

【Linux】访问文件的本质|文件描述符|文件重定向

文章目录 文件的结构文件描述符标准输入输出文件描述符的规则 文件重定向输出重定向(对应符号>)echo的输出重定向 输入重定向&#xff08;对应符号<&#xff09;追加重定向&#xff08;对应符号‘>>’&#xff09;实现文件重定向的函数dup2()参数测试 前言&#xf…

could not publish server configuration for tomcat at localhost

1&#xff0c;报错信息如图&#xff1a; 2&#xff0c;找到servers双击&#xff0c;选择Modules&#xff0c;如果有两个webModules ,remove一个&#xff0c; 3&#xff0c;如果重启还是报错&#xff0c;干脆两个都remove&#xff0c;双击tomcat服务add And Remove重新添加

springboot/ssm酒店客房管理系统Java在线酒店预约预定平台web

springboot/ssm酒店客房管理系统Java在线酒店预约预定平台web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;…

【Python】深度学习基础知识——梯度下降详解和示例

尽管梯度下降&#xff08;gradient descent&#xff09;很少直接用于深度学习&#xff0c;但它是随机梯度下降算法的基础&#xff0c;也是很多问题的来源&#xff0c;如由于学习率过大&#xff0c;优化问题可能会发散&#xff0c;这种现象早已在梯度下降中出现。本文通过原理和…

Docker知识点总结

二、Docker基本命令&#xff1a; Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装&#xff0c;安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker&#xff1a; yum install docker -y -y 表示自动确认…

flutter旋转动画,算法题+JVM+自定义View

在很多的博客或者书上&#xff0c;说有三种&#xff0c;除了上述的两种以外&#xff0c;还有一种是实现Callable接口。但是这种并不是&#xff0c;因为&#xff0c;我们检查JDK中Thread的源码&#xff0c;看它的注释&#xff1a; There are two ways to create a new thread o…

Linux操作系统的vim常用命令和vim 键盘图

在vi编辑器的命令模式下&#xff0c;命令的组成格式是&#xff1a;nnc。其中&#xff0c;字符c是命令&#xff0c;nn是整数值&#xff0c;它表示该命令将重复执行nn次&#xff0c;如果不给出重复次数的nn值&#xff0c;则命令将只执行一次。例如&#xff0c;在命令模式下按j键表…

Dockerfile的艺术:构建高效容器镜像的指令详解与实战指南

在容器化技术风靡全球的今天&#xff0c;Dockerfile作为构建 Docker 镜像的蓝图&#xff0c;其编写技巧与理解深度直接影响着应用部署的效率与稳定性。本文将深入剖析Dockerfile中的核心指令&#xff0c;以实战角度为您呈现一份详尽的解读与操作指南&#xff0c;并在文末抛出一…

docker通过dockerfile安装sftp教程

自制sftp镜像 Dockerfile构建镜像运行sftp容器sftp测试 Dockerfile # 使用基础镜像 FROM ubuntu:22.04# 安装 OpenSSH 服务器和 SFTP 所需的工具 RUN apt-get update && \apt-get install -y openssh-server && \mkdir /var/run/sshd # && apt-get…

mysql8 MGR集群部署

服务器环境 系统主机名IPCentOS 7.9mgr-node01192.168.200.31CentOS 7.9mgr-node02192.168.200.32CentOS 7.9mgr-node03192.168.200.33 mysql8安装 tar zxvf mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar.gzrpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64rpm -ivh mysql-c…

Fuyu-8B A Multimodal Architecture for AI Agents

Fuyu-8B: A Multimodal Architecture for AI Agents Blog: https://www.adept.ai/blog/fuyu-8b TL; DR&#xff1a;无视觉编码器和 adapter&#xff0c;纯解码器结构的多模态大模型。 Adept 是一家做 Copilot 创业的公司&#xff0c;要想高效地帮助用户&#xff0c;必须要准确…

【Linux网络】再谈 “协议“

目录 再谈 "协议" 结构化数据的传输 序列化和反序列化 网络版计算器 封装套接字操作 服务端代码 服务进程执行例程 启动网络版服务端 协议定制 客户端代码 代码测试 使用JSON进行序列化与反序列化 我们程序员写的一个个解决我们实际问题&#xff0c;满…

新品发布会媒体邀请,邀约记者现场报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 新品发布会媒体邀请及记者现场报道邀约流程&#xff1a; 一、策划准备 明确新品发布会时间、地点和主题。 制定媒体邀请计划&#xff0c;确定目标媒体。 二、邀请媒体 向目标媒体发送…

后端面试题整理-1

1.Maven 依赖传递产生版本冲突怎么解决&#xff1f; 升级或降级依赖版本&#xff1a;通过修改相关依赖的版本号&#xff0c;选择与项目其他依赖兼容的版本。可以通过查看 Maven 依赖树来确定哪些依赖冲突&#xff0c;并找出合适的版本号进行调整。排除依赖&#xff1a;对于特定…

CSS的三种定位,响应式web开发项目教程

标准文档流 文档流&#xff1a;指的是元素排版布局过程中 戳这里领取完整开源项目&#xff1a;【一线大厂前端面试题解析核心总结学习笔记Web真实项目实战最新讲解视频】 &#xff0c;元素会默认自动从左往右&#xff0c;从上往下的流式排列方式。并最终窗体自上而下分成一行行…

12、电源管理入门之clock驱动

目录 1. clock驱动构架 1.2 clock consumer介绍 2. Clock Provider 2.1 数据结构表示 2.2 clock provider注册初始化 2.3 DTS配置 2.4 clock驱动实现举例: 3. clock consumer 3.1 获取clock 3.2 操作clock 3.3 实例操作 4. SoC硬件中的使用 参考: 电源管理的两个…

记录一下go的包管理

如何降低版本 假设go版本go.mod: go 1.16运行项目&#xff0c; 查看运行报错&#xff0c;根据报错信息&#xff0c;一条一条解决 go run main.go错误: /home/server1/go/pkg/mod/google.golang.org/grpcv1.58.2/internal/buffer/unbounded.go:92:34: undefined: any类似这样的…

QT延时/等待

一、阻塞型延时 阻塞的原理就是&#xff1a;在延迟期间&#xff0c;本线程的事件循环得不到处理 1.QThread类的sleep() 最简单的延时方法就是使用QThread类的sleep(n)、msleep(n)、usleep(n)&#xff0c;这几个函数的不良后果就是&#xff0c;GUI会在延时的时间段内失去响应…

《 前端 vs. 后端:挑战与机遇的对决》

前言 前端开发和后端开发是构建网站、应用程序和其他软件的两个主要方面。它们各自负责不同的任务和功能。 前端开发: 定义:前端开发是指构建用户直接与之交互的网站或应用程序的过程。前端开发主要关注于用户界面和用户体验。技术栈:前端开发通常涉及使用 HTML、CSS 和 Ja…

组基轨迹建模 GBTM的介绍与实现(Stata 或 R)

基本介绍 组基轨迹建模&#xff08;Group-Based Trajectory Modeling&#xff0c;GBTM&#xff09;&#xff08;旧名称&#xff1a;Semiparametric mixture model&#xff09; 历史&#xff1a;由DANIELS.NAGIN提出&#xff0c;发表文献《Analyzing Developmental Trajectori…