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

二叉树层序遍历. - 力扣(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);
    }
相关推荐
弥彦_2 分钟前
cf1925B&C
数据结构·算法
YuTaoShao23 分钟前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
Wendy14418 小时前
【线性回归(最小二乘法MSE)】——机器学习
算法·机器学习·线性回归
拾光拾趣录8 小时前
括号生成算法
前端·算法
渣呵9 小时前
求不重叠区间总和最大值
算法
拾光拾趣录9 小时前
链表合并:双指针与递归
前端·javascript·算法
好易学·数据结构9 小时前
可视化图解算法56:岛屿数量
数据结构·算法·leetcode·力扣·回溯·牛客网
香蕉可乐荷包蛋10 小时前
AI算法之图像识别与分类
人工智能·学习·算法
chuxinweihui11 小时前
stack,queue,priority_queue的模拟实现及常用接口
算法
tomato0911 小时前
河南萌新联赛2025第(一)场:河南工业大学(补题)
c++·算法