当前位置: 首页 > news >正文

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

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

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

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 标记。

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.二叉树层序遍历-自底向上

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

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.二叉树的锯齿形层序遍历

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

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叉树的层序遍历

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.在每个树行中找最大值

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

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.在每个树行中找平均值

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.二叉树的右视图

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,即从右向左遍历。那么就可以先添加右节点,再添加左节点,达到反过来的效果。

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题

【持续更新】。

如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤
个人主页:星不易 ♥
算法通关村专栏:不易|算法通关村 ♥

http://www.lryc.cn/news/222621.html

相关文章:

  • vue中通过js控制scss变量
  • 深度学习理论知识入门【EM算法、VAE算法、GAN算法】和【RBM算法、MCMC算法、HMC算法】
  • Java8实战-总结47
  • 功能: 在web应用程序中、读取文件
  • TDD、BDD、ATDD以及SBE的概念和区别
  • Android studio:打开应用程序闪退的问题
  • Mysql数据库性能优化--performance_SCHEMA.STATEMENTS语句分析
  • [C/C++]数据结构 链表OJ题: 反转链表
  • 深度学习之基于YoloV5交通信号标志识别系统
  • Linux命令大全
  • 元宇宙是否为噱头?若不是,什么是元宇宙?他的概念、技术、应用和影响是什么?
  • 293_C++_告警类
  • MySQL基础操作
  • ajax样式演示
  • Web前端—CSS高级(定位、高级技巧、CSS修饰属性、综合案例:购物网站轮播图)
  • linux的sftp复制传输文件
  • 【星海出品】flask(一)demo
  • 从vue源码中看diff算法
  • 【17】c++11新特性 —>弱引用智能指针weak_ptr(2)
  • 如何去除视频水印?三种简便有效的方法解决视频水印问题
  • 快速构建高质量中文APP登录注册页面Figma源文件
  • MySQL库的库操作指南
  • 【单目测距】单目相机测距(三)
  • Evaluating Large Language Models: A Comprehensive Survey
  • ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索
  • 【Head First 设计模式】-- 策略模式
  • 能链智电,“重”症在身
  • python 视频硬字幕去除 内嵌字幕去除工具 vsr
  • 蓝桥等考C++组别六级004
  • SpringBoot之Swagger