LeetCode ACM模式——二叉树篇(一)

news2024/11/25 20:23:49

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 

目录

定义二叉树

创建二叉树

利用前序遍历创建二叉树

利用数组创建二叉树

打印二叉树

144. 二叉树的前序遍历

递归遍历

迭代遍历(利用栈)

145. 二叉树的后序遍历

​编辑递归遍历

迭代遍历(利用栈)

94. 二叉树的中序遍历 

递归遍历

迭代遍历(利用栈)

定义二叉树

public class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;

	public TreeNode() {
	}

	public TreeNode(int val){
		this.val=val;
	}
	public TreeNode(int val,TreeNode left,TreeNode right){
		this.val=val;
		this.left=left;
		this.right=right;
	}


}

创建二叉树

利用前序遍历创建二叉树

/**
 * @author light
 * @Description 基于前序遍历创建二叉树
 * @create 2023-08-13 20:24
 */
public class BinaryTree {
	TreeNode root; //根节点
	int size;  //树的长度
	int index=0;

    //Integer[] data:数值数组
	public BinaryTree(Integer[] data) {
		this.size=data.length;
		root=createTree(data);
	}

	public TreeNode createTree(Integer[] data){//递归生成二叉树
		Integer val=data[index++];
		if(val==null){
			return null;
		}
		TreeNode node=new TreeNode(val);
		node.left=createTree(data);
		node.right=createTree(data);
		return node;
	}
}

利用数组创建二叉树

/**
 * @author light
 * @Description 利用数组创建二叉树
 * @create 2023-08-14 12:38
 */
public class BinaryTree2 {
	TreeNode root; //根节点
	int size;  //树的长度
	Integer[] data;

	public BinaryTree2(Integer[] data) {
		this.data=data;
		this.size=data.length;
		root=createTree(0);
	}

	private TreeNode createTree(int index) {
		if(index>=size){
			return null;
		}
		if(data[index]==null){
			return null;
		}
		TreeNode node=new TreeNode(data[index]);
		node.left=createTree(2*index+1);
		node.right=createTree(2*index+2);
		return node;

	}

}

打印二叉树

/**
 * @author light
 * @Description 打印二叉树
 * @create 2023-08-14 13:06
 */
public class BinaryTreePrinter {
	public static void printTree(TreeNode root) {
		printTree(root, 0);
	}

	private static void printTree(TreeNode node, int level) {
		if (node == null) {
			return;
		}
		System.out.print(node.val+"\t");
		printTree(node.left, level + 1);
		printTree(node.right, level + 1);
	}

	public static void main(String[] args) {
		// 创建一个二叉树
		TreeNode root = new TreeNode(1);
		root.left = new TreeNode(2);
		root.right = new TreeNode(3);
		root.left.left = new TreeNode(4);
		root.left.right = new TreeNode(5);
		root.right.left = new TreeNode(6);
		root.right.right = new TreeNode(7);

		// 打印二叉树
		printTree(root);
	}

}

 

144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

递归遍历

package com.light.code.leetcode.binarytree;

import java.util.ArrayList;
import java.util.List;

/**
 * @author light
 * @Description 二叉树的前序遍历
 * @create 2023-08-13 19:43
 */
public class PreorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };

		BinaryTree tree=new BinaryTree(data);
		System.out.println("递归前序遍历:");
		List<Integer> res1=preorderTraversal_Recursion(tree.root);
		System.out.println(res1);

	}

	//递归遍历
	public static List<Integer> preorderTraversal_Recursion(TreeNode root) {
		List<Integer> res=new ArrayList<>();
		traversal(root,res);
		return res;
	}
	public static void traversal(TreeNode root,List<Integer> res){
		if(root==null){
			return ;
		}
		res.add(root.val); //中
		traversal(root.left,res); //左
		traversal(root.right,res); //右

	}
	
}

迭代遍历(利用栈)

package com.light.code.leetcode.binarytree;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

/**
 * @author light
 * @Description 二叉树的前序遍历
 * @create 2023-08-13 19:43
 */
public class PreorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };

		BinaryTree tree=new BinaryTree(data);
		System.out.println("迭代前序遍历");
		List<Integer> res2=preorderTraversal_Iterate(tree.root);
		System.out.println(res2);

	}

	//迭代遍历(利用栈:前序遍历顺序:中-左-右,入栈顺序:中-右-左
	public static List<Integer> preorderTraversal_Iterate(TreeNode root) {
		List<Integer> list=new ArrayList<>();
		Deque<TreeNode> stack=new ArrayDeque<>();
		if(root==null){
			return list;
		}
		stack.push(root);
		while(!stack.isEmpty()){
			TreeNode node=stack.pop();
			list.add(node.val);
			if(node.right!=null){
				stack.push(node.right);
			}
			if(node.left!=null){
				stack.push(node.left);
			}
		}
		return list;
	}
}

145. 二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

递归遍历

import java.util.ArrayList;
import java.util.List;

/**
 * @author light
 * @Description 二叉树后序遍历
 * @create 2023-08-13 19:46
 */
public class PostorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };
		BinaryTree tree=new BinaryTree(data);

		System.out.println("递归后序遍历:");
		List<Integer> res1=postorderTraversal_Recursion(tree.root);
		System.out.println(res1);

	}

	//递归遍历
	public static List<Integer> postorderTraversal_Recursion(TreeNode root) {
		List<Integer> res=new ArrayList<>();
		traversal_Recursion(root,res);
		return res;
	}

	public static void traversal_Recursion(TreeNode root,List<Integer> res){
		if(root==null){
			return;
		}
		traversal_Recursion(root.left,res);//左
		traversal_Recursion(root.right,res);//右
		res.add(root.val);//中
	}
	
}

迭代遍历(利用栈)

import java.util.*;

/**
 * @author light
 * @Description 二叉树后序遍历
 * @create 2023-08-13 19:46
 */
public class PostorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };
		BinaryTree tree=new BinaryTree(data);

		System.out.println("迭代后续遍历");
		List<Integer> res2=postorderTraversal_Iterate(tree.root);
		System.out.println(res2);

	}
	//迭代遍历(利用栈:后序遍历顺序:左-右-中,入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果
	public static List<Integer> postorderTraversal_Iterate(TreeNode root) {
		List<Integer> list=new ArrayList<>();
		Deque<TreeNode> stack=new ArrayDeque<>();
		if(root==null){
			return list;
		}
		stack.push(root);
		while(!stack.isEmpty()){
			TreeNode node=stack.pop();
			list.add(node.val);
			if(node.left!=null){
				stack.push(node.left);
			}
			if(node.right!=null){
				stack.push(node.right);
			}
		}
		Collections.reverse(list);
		return list;
	}
}

94. 二叉树的中序遍历 

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

递归遍历

import java.util.ArrayList;
import java.util.List;

/**
 * @author light
 * @Description 二叉树中序遍历
 * @create 2023-08-13 19:48
 */
public class InorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };
		BinaryTree tree=new BinaryTree(data);
		System.out.println("递归中序遍历");
		List<Integer> res=inorderTraversal_Recursion(tree.root);
		System.out.println(res);
	}

	//递归遍历
	public static List<Integer> inorderTraversal_Recursion(TreeNode root) {
		List<Integer> res=new ArrayList<>();
		traversal_Recursion(root,res);
		return res;
	}

	public static void traversal_Recursion(TreeNode root,List<Integer> res){
		if(root==null){
			return;
		}
		traversal_Recursion(root.left,res);//左
		res.add(root.val);//中
		traversal_Recursion(root.right,res); //右

	}
	
}

迭代遍历(利用栈)

package com.light.code.leetcode.binarytree;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

/**
 * @author light
 * @Description 二叉树中序遍历
 * @create 2023-08-13 19:48
 */
public class InorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };
		BinaryTree tree=new BinaryTree(data);
		System.out.println("迭代中序遍历");
		List<Integer> res2=inorderTraversal_Iterate(tree.root);
		System.out.println(res2);
	}

	//迭代遍历
	public static List<Integer> inorderTraversal_Iterate(TreeNode root) {
		List<Integer> list=new ArrayList<>();
		TreeNode cur=root;//用来遍历二叉树
		Deque<TreeNode> stack=new ArrayDeque<>(); //用来存放遍历过的结点
		if(cur==null){
			return list;
		}
		while(cur!=null||!stack.isEmpty()){
			if(cur!=null){
				stack.push(cur);
				cur=cur.left;
			}else {
				cur=stack.pop();
				list.add(cur.val);
				cur=cur.right;
			}
		}
		return list;
	}
}

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

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

相关文章

移动端预览指定链接的pdf文件流

场景 直接展示外部系统返回的获取文件流时出现了跨域问题&#xff1a; 解决办法 1. 外部系统返回的请求头中调整&#xff08;但是其他系统不会给你改的&#xff09; 2. 我们系统后台获取文件流并转为新的文件流提供给前端 /** 获取传入url文件流 */ GetMapping("/get…

43 | 抖音大V人民日报粉丝数分析

背景介绍 抖音是一个面向全年龄的音乐短视频社区平台,如今已成为最火的短视频软件,无数短视频创作者通过抖音分享生活,分享技能,分享美好。其中有点赞、评论、转发、关注等功能。 我们试图分析“大 V”即粉丝数量相对较多的博主的涨粉数量和点赞、评论、转发之间的关系,…

uniapp的逆地理编码 和地理编码

1.先打开高德地图api找到那个 地理编码 2.封装好我们的请求 3.逆地理编码 和地理编码 都是固定的 记住自己封装的请求 就可以了 这个 是固定的 方式 下面这个是固定的 可以复制过去 getlocation就是uniapp提供的 获取经纬度 然后 下面的 就是高德地图提供的 方法 要想使用我…

git Authentication failed

情况是这样的&#xff0c;之前看代码只是clone了一份&#xff0c;但随着分支越来越多&#xff0c;有时候切换分支时必须先把修改的代码 stash 一下&#xff0c;觉得很麻烦&#xff0c;于是又clone了一份代码。然后pull代码是正常的&#xff0c;当push 代码的时候&#xff0c;去…

Python深度学习“四大名著”之一全新PyTorch版 | 送书活动

目录 前言一、序二、内容简介三、作者简介四、福利(本次活动赠书2-5本&#xff0c;根据阅读量&#xff0c;评论区抽取小伙伴送书)总结 前言 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互…

Java多线程编程:实现并发处理的高效利器

Java多线程编程&#xff1a;实现并发处理的高效利器 作者&#xff1a;Stevedash 发表于&#xff1a;2023年8月13日 20点45分 来源&#xff1a;Java 多线程编程 | 菜鸟教程 (runoob.com) ​ 在计算机领域&#xff0c;多线程编程是一项重要的技术&#xff0c;可以使程序同时执…

Linux 性能分析之iostat命令详解

Linux 性能分析之iostat命令详解 iostat命令是IO性能分析的常用工具&#xff0c;其是input/output statistics的缩写。本文将着重于下面几个方面介绍iostat命令&#xff1a; iostat的安装iostat命令行选项说明iostat输出内容分析如何确定磁盘IO的瓶颈iostat实际案例 命令的安…

【先进PID控制算法(ADRC,TD,ESO)加入永磁同步电机发电控制仿真模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux 介绍

Linux一切皆文件&#xff1a;文件就 读、写、权限 学习方式&#xff1a; 1、认识Linux 2、基本的命令&#xff08;重点&#xff1a;git讲了一些基本的命令【文件操作、目录管理、文件属性、Vim编辑器、账号管理、磁盘管理…】&#xff09; 3、软件的安装和部署&#xff01;&am…

MongoDB 简介

什么是MongoDB ? MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…

kubernetes二进制部署2之 CNI 网络组件部署

CNI 网络组件部署 一&#xff1a;K8S提供三大接口1容器运行时接口CRI2云原生网络接口CNI3云原生存储接口CSI 部署 flannelK8S 中 Pod 网络通信&#xff1a;Overlay Network&#xff1a;VXLAN&#xff1a;Flannel:Flannel udp 模式的工作原理&#xff1a;ETCD 之 Flannel 提供说…

Springboot 实践(2)MyEclipse2019创建项目修改pom文件,加载springboot 及swagger-ui jar包

MyEclipse2019创建工程之后&#xff0c;需要添加Springboot启动函数、添加application.yml配置文件、修改pom文件添加项目使用的jar包。 添加Springboot启动函数 创建文件存储路径 &#xff08;1&#xff09;右键单击“src/main/java”文件夹&#xff0c;弹出对话框输入路径…

电压放大器和电荷放大器区别是什么意思

电压放大器和电荷放大器是两种常见的信号放大器。它们的区别主要在于其输入端口所呈现的电路特性不同。 电压放大器的介绍 电压放大器是一种将输入信号的电压增益放大的电路元件&#xff0c;其输入端口呈现高阻抗特性。即在输入端口上&#xff0c;电压放大器所对应的电路模型中…

为什么我不推荐任何人用C语言作为编程启蒙第一课?

前言 写了20多年的代码&#xff0c;之前做过阿里的高级架构师&#xff0c;在技术这条路上跌跌撞撞了很多&#xff0c;我今天分享一些我个人的自学方法给各位。为什么我会说&#xff1a;不推荐任何人用C语言作为编程启蒙第一课&#xff1f; 这里有很多同学要站出来说了&#x…

人工智能在公检系统中的应用:校对软件助推刑事侦查工作

人工智能在公检系统中的应用&#xff0c;尤其是校对软件的应用&#xff0c;可以有效地助推刑事侦查工作。 以下是校对软件在刑事侦查工作中的一些应用方面&#xff1a; 1.自动校对和纠错&#xff1a;校对软件可以自动检测和纠正刑事侦查报告中的语法、拼写和标点错误等问题。通…

使用css实现时间线布局(TimeLine)

前言 在使用uni-app开发微信小程序过程中&#xff0c;遇到了时间轴布局&#xff0c;由于每项的内容高度不一致&#xff0c;使用uniapp自带的扩展组件uni-steps&#xff0c;样式布局无法对齐竖线&#xff0c;于是自己造轮子&#xff0c;完成特殊的布局。显示效果如下&#xff1…

[保研/考研机试] KY85 二叉树 北京大学复试上机题 C++实现

题目链接&#xff1a; 二叉树https://www.nowcoder.com/share/jump/437195121692000296981 描述 如上所示&#xff0c;由正整数1&#xff0c;2&#xff0c;3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是&#xff0c;结点m所在的子树中一共包…

【LeetCode每日一题】——41.缺失的第一个正数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 困难 三【题目编号】 41.缺失的第一个正数 四【题目描述】 给你一个…

新能源电动车充电桩控制主板安全特点

新能源电动车充电桩控制主板安全特点 你是否曾经担心过充电桩的安全问题?充电桩主板又是什么样的呢?今天我们就来聊聊这个话题。 充电桩主板采用双重安全防护系统&#xff0c;包括防水、防护、防尘等&#xff0c;确保充电桩安全、可靠。不仅如此&#xff0c;充电桩主板采用先…

公文与校对:无缝链接的艺术与重要性

在公文写作的世界中&#xff0c;清晰、准确且专业的语言是成功沟通的关键。然而&#xff0c;许多人可能忽视了公文写作过程中一个至关重要的环节——校对。无论是初步的草稿还是最终的成品&#xff0c;校对都是确保公文达到预期目标的重要工具。在这个环节中&#xff0c;爱校对…