力扣之每日四题day01--二叉树遍历篇

2024-04-03 04:28

本文主要是介绍力扣之每日四题day01--二叉树遍历篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二叉树遍历

    • 144.二叉树的前序遍历
    • 145.二叉树的后序遍历
    • 94.二叉树的中序遍历
    • 102.二叉树的层序遍历

144.二叉树的前序遍历

力扣地址

import java.util.ArrayList;
import java.util.List;/*** 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 List<Integer> preorderTraversal(TreeNode root) {//方法用于初始化并返回前序遍历的结果列表List<Integer>res=new ArrayList<>();//调用递归的前序遍历方法preorderTraversal(root,res);return res;}//递归方法用于前序遍历public void preorderTraversal(TreeNode root, List<Integer>res){//基本情况,如果当前节点为空,返回if(root==null){return;}//将当前节点的值加入到结果列表res.add(root.val);//递归调用左子树preorderTraversal(root.left,res);//递归调用右子树preorderTraversal(root.right,res);}
}

二叉树的前序遍历是一种深度优先遍历(DFS)的方法,它按照“根节点 -> 左子树 -> 右子树”的顺序遍历二叉树的节点。具体实现思路如下:

  • 基本情况:首先处理基本情况,即当前节点为空时直接返回,表示到达了二叉树的叶子节点或空节点。
  • 处理当前节点:对于非空节点,将当前节点的值添加到结果列表中,表示对当前节点的访问。
  • 递归遍历左子树:然后递归调用前序遍历方法,传入当前节点的左子树作为新的根节点,继续遍历左子树的节点。
  • 递归遍历右子树:最后递归调用前序遍历方法,传入当前节点的右子树作为新的根节点,继续遍历右子树的节点。

145.二叉树的后序遍历

力扣地址

import java.util.ArrayList;
import java.util.List;/*** 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 List<Integer> postorderTraversal(TreeNode root) {//创建一个存储结果结果的列表List<Integer>res=new ArrayList<Integer>();//递归调用方法postorderTraversal(root,res);//返回遍历的结果return res;}//定义递归方法,实现二叉树的后序遍历public void postorderTraversal(TreeNode root,List<Integer>res){//如果当前节点返回为空if(root==null){return;}//遍历左子树postorderTraversal(root.left,res);//遍历右子树postorderTraversal(root.right,res);//将当前节点的值添加到遍历结果列表res.add(root.val);}
}

二叉树的后序遍历是一种深度优先遍历(DFS)的方法,它按照“左子树 -> 右子树 -> 根节点”的顺序遍历二叉树的节点。具体实现思路如下:

  • 基本情况:首先处理基本情况,即当前节点为空时直接返回,表示到达了二叉树的叶子节点或空节点。
  • 递归遍历左子树:然后递归调用后序遍历方法,传入当前节点的左子树作为新的根节点,继续遍历左子树的节点。
  • 递归遍历右子树:接着递归调用后序遍历方法,传入当前节点的右子树作为新的根节点,继续遍历右子树的节点。
  • 处理当前节点:最后,将当前节点的值添加到结果列表中,表示对当前节点的访问。

94.二叉树的中序遍历

import java.util.ArrayList;
import java.util.List;/*** 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 List<Integer> inorderTraversal(TreeNode root) {//创建一个存储遍历结果的列表List<Integer>res=new ArrayList<>();//调用递归方法进行中序遍历inorder(root,res);//返回值return res;}//定义递归的方法,实现二叉树的中序遍历public void inorder(TreeNode root,List<Integer>res){//如果当前节点为空,直接返回if(root==null){return;}//遍历左子树inorder(root.left,res);//将当前节点的值添加到res列表中res.add(root.val);//遍历右子树inorder(root.right, res);}}

二叉树的中序遍历是一种深度优先遍历(DFS)的方法,它按照“左子树 -> 根节点 -> 右子树”的顺序遍历二叉树的节点。具体实现思路如下

  • 基本情况:首先处理基本情况,即当前节点为空时直接返回,表示到达了二叉树的叶子节点或空节点。
  • 递归遍历左子树:然后递归调用中序遍历方法,传入当前节点的左子树作为新的根节点,继续遍历左子树的节点。
  • 处理当前节点:接着将当前节点的值添加到结果列表中,表示对当前节点的访问。
  • 递归遍历右子树:最后递归调用中序遍历方法,传入当前节点的右子树作为新的根节点,继续遍历右子树的节点。

102.二叉树的层序遍历

力扣地址

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;/*** 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 List<List<Integer>> levelOrder(TreeNode root) {//存储最终的结果列表List<List<Integer>>res=new ArrayList<>();//用队列进行层序遍历Queue<TreeNode>queue=new ArrayDeque<>();//如果根节点不为空,将根节点加入队列if(root!=null){queue.add(root);}//循环遍历每一层的节点while(!queue.isEmpty()){//获取当前层的节点的个数int n=queue.size();//用于存储当前层节点的值List<Integer>level=new ArrayList<>();//遍历当前的节点for(int i=0;i<n;i++){//出队列,获取当前的节点TreeNode node=queue.poll();//将当前节点加入当前层的列表level.add(node.val);//将当前节点的左孩子加入队列if(node.left!=null){queue.add(node.left);}//将当前节点的右孩子加入队列if(node.right!=null){queue.add(node.right);}}//将当前层的列表加入最终结果列表res.add(level);}//返回最终结果列表return res;}
}

二叉树的层序遍历是一种广度优先遍历(BFS)的方法,它按照层级顺序逐层遍历二叉树的节点。具体思路如下

  • 创建数据结构:首先定义一个队列 queue 用于存储待遍历的节点,以及一个结果列表 res 用于存储每一层的节点值。
  • 初始化:如果根节点不为空,则将根节点加入队列。
  • 层序遍历:使用循环遍历每一层的节点,直到队列为空。在循环中
  • 获取当前层的节点个数 n,这个值等于当前队列的大小,表示当前层的节点数。
  • 创建一个列表 level 用于存储当前层的节点值。
  • 遍历当前层的节点,从队列中依次取出节点,将节点值加入 level 列表中,然后将节点的左右子节点(如果存在)加入队列。
  • 将存储当前层节点值的 level 列表加入结果列表 res 中。

这篇关于力扣之每日四题day01--二叉树遍历篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871902

相关文章

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1(错误经验) #include <iostream>#include <string>using namespace std;int main() {string s;string ret;int count = 0;while(cin >> s)for(auto a : s){if(count == 0){if( a <=

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,