【数据结构】二叉树相关oj题(一)

目录

1、二叉树的构建及遍历

1.1、题目介绍

1.2、解题思路

1.3、代码描述

1.4、完整代码

 2、二叉树的层次遍历

2.1、题目介绍

2.2、解题思路

2.3、代码描述

2.4、完整代码 

 

1、二叉树的构建及遍历

1.1、题目介绍

原题链接:KY11 二叉树构建及遍历_牛客题霸_牛客网 (nowcoder.com)

示例1:

输入:abc##de#g##f###

输出:c b e g d f a

1.2、解题思路

根据题意可知,读入的字符串是一串先序遍历字符串,那么根据字符串创建二叉树也就需要遵循先序遍历进行创建。

1.3、代码描述

首先自行定义一个TreeNode类

class TreeNode {public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}
}

因为递归创建,为了确保str能够正常遍历结束,因此这里定义一个成员变量 i 用于记录str当前访问的位置。

char ch = str.charAt(i++); 此时当ch不为#时再创建节点root,并且对左孩子和右孩子分别进行递归创建。

    public static int i = 0;public static TreeNode createTree(String str) {if(str == null) {return null;}TreeNode root = null;char ch = str.charAt(i++);if(ch != '#') {root = new TreeNode(ch);root.left = createTree(str);root.right = createTree(str);} return root;}

最后执行中序遍历将结果打印出来即可

    public static void inOrder(TreeNode root) {if(root == null) {return;}inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);}

1.4、完整代码

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 void main(String[] args) {Scanner in = new Scanner(System.in);String str = in.nextLine();//创建二叉树TreeNode root = createTree(str);//中序遍历二叉树inOrder(root);}public static int i = 0;public static TreeNode createTree(String str) {if(str == null) {return null;}TreeNode root = null;char ch = str.charAt(i++);if(ch != '#') {root = new TreeNode(ch);root.left = createTree(str);root.right = createTree(str);} return root;}public static void inOrder(TreeNode root) {if(root == null) {return;}inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);}
}

 2、二叉树的层次遍历

2.1、题目介绍

原题链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

 示例1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例2:

输入:root = [1]
输出:[[1]]

示例3: 

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

2.2、解题思路

        层次遍历需要使用到队列,利用队列先进先出的特性使遍历能够从上到下,从左到右顺序遍历。该题唯一的难点就是返回值的规范。

        题目中要求返回的是List<List<Integer>>,从示例中可以看出,每一层的节点分别使用有一个List来存储,这就要求我们不仅需要实现层序遍历,还需要将遍历结果按照层数划分

2.3、代码描述

首先实现层次遍历,判断root不等于null后执行以下代码,将root入队之后,观察队列状况,当队列不为空时将节点出队,并判断出队节点是否存在左右节点,如果存在则入队。依次执行循环后最终得到打印结果就为层次遍历结果。

        Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while(!queue.isEmpty()) {TreeNode cur = queue.poll();//此处对cur.val执行打印操作,打印的顺序就是层次遍历顺序System.out.print(root.val + " ");if(cur.left != null) {queue.add(cur.left);}if(cur.right != null) {queue.add(cur.right);}}

假设二叉树的结构如下:

 

        通过画图可以观察到,当将1入队后,此时队长为1。然后1出队后将2,3入队 ,此时队长为2。然后2出队4,5入队,3出队6入队,此时队长为3。

        相信大家都看出规律了,即每当执行完一组入队操作之后,此时队列的长度就等于层数个数。根据这个规律,我们可以在每次while循环的开始计算此时队列的长度,用于记录该层需要出队的次数,从而确定每一层的节点,并将其存放到list中,最后当while循环结束时将list添加到retList中。

具体优化后的代码如下文的【完整代码】 

2.4、完整代码 

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> retList = new LinkedList<>();if(root == null) {return retList;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while(!queue.isEmpty()) {List<Integer> list = new LinkedList<>();   //存放一层节点的集合Listint size = queue.size();   //每次计算队列长度while(size --> 0) {   //每完成一次出队,size自减1TreeNode cur = queue.poll();list.add(cur.val);   if(cur.left != null) {queue.add(cur.left);}if(cur.right != null) {queue.add(cur.right);}}retList.add(list);  //将一层的节点添加到返回集合retList中}return retList;}
}

 

【博主推荐】
【计算机网络】虚拟路由冗余(VRRP)协议原理与配置-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/134697735?spm=1001.2014.3001.5502


【JavaSE】基础笔记 - 异常(Exception)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/134564361?spm=1001.2014.3001.5502

 【计算机组成原理】知识点巩固 - 存储器概述_半字地址和字节地址-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/134482974?spm=1001.2014.3001.5502

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

 

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

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

相关文章

ps---4.打造高色感的通透风光图片

ps—4.打造高色感的通透风光图片 素材 操作 复制图层 更改混合模式-将复制图层从正常变为柔光 给复制图层添加图层蒙版-选中蒙版-按住ctrli填充蒙版为黑色-使用白色画笔工具把远处的山和进处的水化成白色&#xff08;保留柔光模式下远处的山和近处的水&#xff09; 调整…

数学建模-------误差来源以及误差分析

绝对误差&#xff1a;精确值-近似值&#xff1b; 举个例子&#xff1a;从A到B&#xff0c;应该有73千米&#xff0c;但是我们近似成了70千米&#xff1b;从C到D&#xff0c;应该是1373千米&#xff0c;我们近似成了1370千米&#xff0c;如果使用绝对误差&#xff0c;结果都是3…

轻松打卡:使用Spring Boot和Redis Bitmap构建高效签到系统【redis实战 四】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 轻松打卡&#xff1a;使用Spring Boot和Redis Bitmap构建高效签到系统【redis实战 四】 引言(redis实战)前言回顾bitmap基本概念核心特性使用场景 为什么使用redis中的bitmap实现&#xff1f;1. 存储效…

20种常用的软件测试方法,建议先收藏再观看

在完整的项目当中算是最后一个环节&#xff0c;也是非常重要的一个环节。通过软件测试&#xff0c;我们才能得知一个程序是否符合标准。 小编整理出20种常见的软件测试方法&#xff0c;建议伙伴们先收藏再看。不敢说史上最全&#xff0c;但我办公室里十年软件测试经验的讲师都…

网络安全03---Nginx 解析漏洞复现

目录 一、准备环境 二、实验开始 2.1上传压缩包并解压 2.2进入目录&#xff0c;开始制作镜像 2.3可能会受之前环境影响&#xff0c;删除即可 ​编辑 2.4制作成功结果 2.5我们的环境一个nginx一个php 2.6访问漏洞 2.7漏洞触发结果 2.8上传代码不存在漏洞 2.9补充&#…

云手机哪一款好用?

随着海外市场的不断发展&#xff0c;云手机市场也呈现蓬勃的态势&#xff0c;众多云设备软件纷纷涌现。企业在选择云手机软件时&#xff0c;如何找到性能卓越的软件成为一项关键任务。在众多选择中&#xff0c;OgPhone云手机凭借其卓越的性能和独特功能脱颖而出。以下是OgPhone…

语义分割(3):损失函数解析

文章目录 1. 常见语义分割损失1.1 Cross Entropy1.2 dice Loss1.2.1 为什么使用Dice loss1.2.2 公式1.2.3 Dice loss 和 F1-score代码 1.3 focal loss1.3.1 公式&#xff1a;1.3.2 代码 2. 语义分割损失应用参考 语义分割任务实际上是一种像素层面上的分类&#xff0c;需要识别…

【HarmonyOS 4.0 应用开发实战】TypeScript 快速入门之环境配置

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

01 质数筛

一、根据概念进行枚举 1、判断质数的枚举算法 根据概念:除了1和它本身以外没有其他约数的数为质数 //输入一个数n&#xff0c;判断n是不是质数 #include<bits/stdc.h> using namespace std;int main(){int n;cin>>n;//根据概念:除了1和它本身以外没有其他约数的…

主成分分析(PCA)Python

实际问题研究中&#xff0c;常常遇到多变量问题&#xff0c;变量越多&#xff0c;问题往往越复杂&#xff0c;且各个变量之间往往有联系。于是&#xff0c;我们想到能不能用较少的新变量代替原本较多的旧变量&#xff0c;且使这些较少的新变量尽可能多地保留原来变量所反映的信…

代码随想录刷题笔记-Day12

1. 二叉树的递归遍历 144. 二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/94. 二叉树的中序遍历https://leetcode.cn/problems/binary-tree-inorder-traversal/145. 二叉树的后续遍历https://leetcode.cn/problems/binary-tree-postorder-tra…