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

二叉树层序遍历. - 力扣(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 小时前
第二章 简单程序设计
开发语言·c++·算法
github_czy2 小时前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法
许愿与你永世安宁3 小时前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子3 小时前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
满分观察网友z4 小时前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
YuTaoShao4 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx4 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背4 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z4 小时前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
杰克尼5 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode