算法通关村第六关|白银|二叉树的层次遍历【持续更新】

1.二叉树基本的层序遍历

仅仅遍历并输出全部元素。

java 复制代码
List<Integer> simpleLevelOrder(TreeNode root) {
    if (root == null) {
        return new ArrayList<Integer>();
    }
    List<Integer> res = new ArrayList<Integer>();
    LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
    queue.add(root);
    while (queue.size() > 0) {
        TreeNode t = queue.remove();
        res.add(t.val);
        if (t.left != null) {
            queue.add(t.left);
        }
        if (t.right != null) {
            queue.add(t.right);
        }
    }
    return res;
}

2.二叉树层序遍历,但是按层分开

用 size 标记。

java 复制代码
public List<List<Integer>> levelOrder(TreeNode root) {
	if (root == null) {
        return new ArrayList<List<Integer>>();
	}

	List<List<Integer>> res = new ArrayList<List<Integer>>();
	LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
	queue.add(root);
	while (queue.size() > 0) {
        // 获取当前层的元素个数
        int size = queue.size();
        ArrayList<Integer> temp = new ArrayList<Integer>();
        for (int i = 0; i < size; i++) {
            TreeNode t = queue.remove();
            temp.add(t.val);
            if (t.left != null) {
                queue.add(t.left);
            }
            if (t.right != null) {
                queue.add(t.right);
            }
        }
        res.add(temp);
    }
	return res;
}

3.二叉树层序遍历-自底向上

自底向上,逐层从左向右遍历。

和从根节点开始遍历基本一样,只不过是在往结果里存储的时候顺序改变。

java 复制代码
public List<List<Integer>> levelOrderBottom(TreeNode root) {
	List<List<Integer>> levelOrder = new LinkedList<List<Integer>>();
	if (root == null) {
        return levelOrder;
    }
	Queue<TreeNode> queue = new LinkedList<TreeNode>();
	queue.offer(root);
	while (!queue.isEmpty()) {
        List<Integer> level = new ArrayList<Integer>();
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            TreeNode node = queue.poll();
            level.add(node.val);
            TreeNode left = node.left, right = node.right;
            if (left != null) {
                queue.offer(left);
            }
            if (right != null) {
                queue.offer(right);
            }
        }
        // add(index, element)
        // 将元素添加到指定的索引处,原来的链表的索引向后移动
        // 每次都往索引0处放,达到后来的先放的效果
        levelOrder.add(0, level);
    }
	return levelOrder;
}

4.二叉树的锯齿形层序遍历

锯齿形层序遍历就是先从左往右遍历一层,再从右往左遍历一层。

和上面的算法基本一样,只不过要用一个布尔型的变量指示从左向右还是从右向左,从右向左的话就需要从链表的前边进行添加。

java 复制代码
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
	List<List<Integer>> ans = new LinkedList<List<Integer>>();
	if (root == null) {
        return ans;
    }
	Queue<TreeNode> queue = new LinkedList<TreeNode>();
	queue.offer(root);
	// 为true是从左向右遍历,为false是从右向左遍历
	boolean isOrderLeft = true;
	while (!queue.isEmpty()) {
        Deque<Integer> levelList = new LinkedList<Integer>();
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            TreeNode curNode = queue.poll();
            if (isOrderLeft) {
                levelList.offerLast(curNode.val);
            } else {
                levelList.offFirst(curNode.val);
            }
            if (curNode.left != null) {
                queue.offer(curNode.left);
            }
            if (curNode.right != null) {
                queue.offer(curNode.right);
            }
        }
        ans.add(levelList);
        isOrderLeft = !isOrderLeft;
    }
	return ans;
}

5.N叉树的层序遍历

java 复制代码
public List<List<Integer>> nLevelOrder(Node root) {
	List<List<Integer>> value = new ArrayList<>();
	Deque<Node> q = new ArrayDeque<>();
	if (root != null) {
        q.addLast(root);
    }
	while (!q.isEmpty()) {
        Deque<Node> next = new ArrayDeque<>();
        List<Integer> nd = new ArrayList<>();
        while (!q.isEmpty()) {
            Node cur = q.pollFirst();
            nd.add(cur.val);
            for (Node chd : cur.children) {
                if (chd != null) {
                    next.add(chd);
                }
            }
        }
    	q = next;
        value.add(nd);
    }
    return value;
}

6.在每个树行中找最大值

用一个变量记录每行的最大值就好了。

java 复制代码
public List<Integer> largestValues(TreeNode root) {
	List<Integer> res = new ArrayList<>();
	Deque<TreeNode> deque = new ArrayDeque<>();
	if (root != null) {
        deque.addLast(root);
    }
	while (!deque.isEmpty()) {
        int size = deque.size();
        int levelMaxNum = Integer.MIN_VALUE;
        for (int i = 0; i < size; i++) {
            TreeNode node = deque.poll();
            levelMaxNum = Math.max(node.val, levelMaxNum);
            if (node.left != null) {
                deque.addLast(node.left);
            }
            if (node.right != null) {
                deque.addLast(node.right);
            }
        }
        res.add(levelMaxNum);
    }
	return res;
}

7.在每个树行中找平均值

java 复制代码
public List<Double> averageOfLevels(TreeNode root) {
	List<Double> res = new ArrayList<>();
	if (root == null) {
        return res;
    }
	Queue<TreeNode> list = new LinkedList<>();
	list.add(root);
	while (list.size() != 0) {
        int len = list.size();
        double sum = 0;
        for (int i = 0; i < len; i++) {
            TreeNode node = list.poll();
            sum += node.val;
            if (node.left != null) {
                list.add(node.left);
            }
            if (node.right != null) {
                list.add(node.right);
            }
        }
        res.add(sum/len);
    }
	return res;
}

8.二叉树的右视图

java 复制代码
public List<Integer> rightSideView(TreeNode root) {
	List<Integer> res = new ArrayList<>();
	if (root == null) {
        return res;
    }
	Queue<TreeNode> queue = new LinkedList<>();
	queue.offer(root);
	while (!queue.isEmpty()) {
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            TreeNode node = queue.poll();
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
            if (i == size - 1) {
                res.add(node.val);
            }
        }
    }
	return res;
}

9.最底层最左边的值

回想锯齿形遍历时的isOrderLeft,这道题就是这个值一直取false,即从右向左遍历。那么就可以先添加右节点,再添加左节点,达到反过来的效果。

java 复制代码
public int findBottomLeftValue(TreeNode root) {
	if (root.left == null && root.right == null) {
        return root.val;
	}
	Queue<TreeNode> queue = new LinkedList<>();
	queue.offer(root);
	TreeNode temp = new TreeNode(0);

	while (!queue.isEmpty()) {
        temp = queue.poll();
        if (temp.right != null) {
            queue.offer(temp.right);
        }
        if (temp.left != null) {
            queue.offer(temp.left);
        }
    }
	return temp.val;
}

10.力扣404题

【持续更新】。

如果对您有帮助,请点赞关注支持我,谢谢!❤

如有错误或者不足之处,敬请指正!❤

个人主页:星不易

算法通关村专栏:不易|算法通关村

相关推荐
luoluoal4 分钟前
java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)
java·vue.js·spring boot
ChinaRainbowSea9 分钟前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
Crossoads11 分钟前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
小游鱼KF12 分钟前
Spring学习前置知识
java·学习·spring
扎克begod16 分钟前
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
java·开发语言·python
青灯文案117 分钟前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
自身就是太阳19 分钟前
2024蓝桥杯省B好题分析
算法·职场和发展·蓝桥杯
我就是程序猿27 分钟前
tomcat的配置
java·tomcat
阳光阿盖尔33 分钟前
EasyExcel的基本使用——Java导入Excel数据
java·开发语言·excel
二十雨辰35 分钟前
[苍穹外卖]-12Apache POI入门与实战
java·spring boot·mybatis