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

二叉树层序遍历. - 力扣(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);
    }
相关推荐
白羊by34 分钟前
YOLOv1~v11 全版本核心演进总览
深度学习·算法·yolo
墨尘笔尖2 小时前
最大最小值降采样算法的优化
c++·算法
自我意识的多元宇宙3 小时前
二叉树的遍历和线索二叉树--二叉树的遍历
数据结构
qq_5024289904 小时前
清华大学与微软亚洲研究院出品:Kronos 本地部署教程
数据结构·python·金融量化·kronos开源模型
white-persist4 小时前
【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
运维·服务器·网络·python·算法·安全·web安全
FL16238631295 小时前
基于C#winform部署软前景分割DAViD算法的onnx模型实现前景分割
开发语言·算法·c#
baizhigangqw5 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶
算法·启发式算法·web app
C雨后彩虹6 小时前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
cpp_25016 小时前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
Hugh-Yu-1301236 小时前
二元一次方程组求解器c++代码
开发语言·c++·算法