二叉树层序遍历、先序遍历、中序遍历、后序遍历的实现

二叉树层序遍历. - 力扣(LeetCode)

使用bfs进行遍历,将每一层存入一个集合中

java 复制代码
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null)return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
            List<Integer> list = new ArrayList<>();
            //记录本层结点个数
            int size = q.size();
            //找完本层
            for(int i = 0;i < size;i ++){
                TreeNode node = q.poll();
                list.add(node.val);
                if(node.left != null)
                    q.offer(node.left);
                if(node.right != null)
                    q.offer(node.right);
                
            }
            //加入本层
            res.add(list);
        }
        return res;
    }
}

二叉树层序遍历(自底向上). - 力扣(LeetCode)

与上一题解法相同,只需要在存入每层数据时,存在最前面的位置。

也可以搜索完之后,进行反转。

java 复制代码
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null)return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
            List<Integer> list = new ArrayList<>();
            int size = q.size();
            for(int i = 0;i < size;i ++){
                TreeNode node = q.poll();
                list.add(node.val);
                if(node.left != null){
                    q.offer(node.left);
                }
                if(node.right != null){
                    q.offer(node.right);
                }
            }
            //将后面层的数据加在结果的最前面,或者进行反转res集合
            res.add(0,list);
        }
        return res;
    }
}

二叉树的前序遍历 . - 力扣(LeetCode)
按照头节点、左子节点、右子节点的顺序进行记录,这里使用dfs进行解题

java 复制代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        f(res,root);
        return res;
    }
    public static void f(List<Integer> list,TreeNode node){
        if(node == null)return;
        //当找到最后一个子节点时,先记录头节点,再次递归,
        //当子节点为空时结束,不为空时继续,直到结束
        list.add(node.val);
        f(list,node.left);
        f(list,node.right);
    }
}

二叉树的中序遍历. - 力扣(LeetCode)

只需要将f方法进行修改,先记录左子节点,再记录头节点,最后记录右子节点

二叉树的后序遍历 . - 力扣(LeetCode)

只需要将f方法进行修改,先记录右子节点,再记录左子节点,最后记录头节点

java 复制代码
//中序遍历
    public void inorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        inorder(root.left, res);
        res.add(root.val);
        inorder(root.right, res);
    }
//后序遍历
    public void postorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        postorder(root.left, res);
        postorder(root.right, res);
        res.add(root.val);
    }
相关推荐
Coovally AI模型快速验证1 分钟前
SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
人工智能·神经网络·算法·yolo·计算机视觉·目标跟踪·无人机
Brduino脑机接口技术答疑3 分钟前
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
人工智能·算法·脑机接口·新手入门
真的很上进13 分钟前
2025最全TS手写题之partial/Omit/Pick/Exclude/Readonly/Required
java·前端·vue.js·python·算法·react·html5
linweidong19 分钟前
GO 基础语法和数据类型面试题及参考答案(下)
算法·后端面试·泛型·go面试·go面经·go求职
圈圈编码1 小时前
LeetCode Hot100刷题——合并两个有序链表
java·数据结构·算法·leetcode·链表
老歌老听老掉牙1 小时前
旋量理论:刚体运动的几何描述与机器人应用
python·算法·机器学习·机器人·旋量
无聊的小坏坏2 小时前
用递归算法解锁「子集」问题 —— LeetCode 78题解析
算法·深度优先
m0_738596322 小时前
十大排序算法
算法·排序算法
jingfeng5142 小时前
详解快排的四种方式
数据结构·算法·排序算法
MoRanzhi12032 小时前
245. 2019年蓝桥杯国赛 - 数正方形(困难)- 递推
python·算法·蓝桥杯·国赛·递推·2019