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

二叉树层序遍历. - 力扣(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);
    }
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486661 天前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark1 天前
从算法设计模式看编程思维的抽象能力4
算法