【Java】987. 二叉树的垂序遍历---注意同行同列出现多个节点,使用层次遍历(队列存储),Map<Integer,List<Integer>>存储数据,对集合进行排序(List)必不可少!!!

这篇博客介绍了如何使用Java实现二叉树的垂序遍历算法。通过创建一个辅助类来存储节点及其对应的列索引,并利用队列进行广度优先搜索,按列收集节点并进行排序。最终将按列排列的节点值存储为列表返回。算法适用于具有最多1000个节点且节点值不超过1000的二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。

对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1) 。树的根结点位于 (0, 0) 。

二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。

返回二叉树的 垂序遍历 序列。

示例 1:
在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[[9],[3,15],[20],[7]]
解释:
列 -1 :只有结点 9 在此列中。
列 0 :只有结点 3 和 15 在此列中,按从上到下顺序。
列 1 :只有结点 20 在此列中。
列 2 :只有结点 7 在此列中。
示例 2:
在这里插入图片描述

输入:root = [1,2,3,4,5,6,7]
输出:[[4],[2],[1,5,6],[3],[7]]
解释:
列 -2 :只有结点 4 在此列中。
列 -1 :只有结点 2 在此列中。
列 0 :结点 1 、5 和 6 都在此列中。
1 在上面,所以它出现在前面。
5 和 6 位置都是 (2, 0) ,所以按值从小到大排序,5 在 6 的前面。
列 1 :只有结点 3 在此列中。
列 2 :只有结点 7 在此列中。
示例 3:
在这里插入图片描述

输入:root = [1,2,3,4,6,5,7]
输出:[[4],[2],[1,5,6],[3],[7]]
解释:
这个示例实际上与示例 2 完全相同,只是结点 5 和 6 在树中的位置发生了交换。
因为 5 和 6 的位置仍然相同,所以答案保持不变,仍然按值从小到大排序。

提示:

树中结点数目总数在范围 [1, 1000] 内
0 <= Node.val <= 1000

代码:
class Solution {
  public List<List<Integer>> verticalTraversal(TreeNode root) {
		 if(root==null) {
			 return null;
		 }
		 Map<Integer,List<Integer>> map=new TreeMap<>();
		 Map<Integer,List<Integer>> map1=new TreeMap<>();
		 Queue<Node> queue=new LinkedList<>();
		 List<List<Integer>> list=new ArrayList<>();
		 queue.add(new Node(root,0));
		 while(!queue.isEmpty()) {
			 int len=queue.size();
			 while(len>0) {
				 len--;
			     Node pNode=queue.poll();
			     List<Integer> set=map1.getOrDefault(pNode.col,new ArrayList<>());
			      set.add(pNode.node.val);
			      map1.put(pNode.col,set);
	    		 if(pNode.node.left!=null) {
	    			 queue.add(new Node(pNode.node.left,pNode.col-1));
	    		 }
	    		 if(pNode.node.right!=null) {
	    			 queue.add(new Node(pNode.node.right,pNode.col+1));
	    		 }
			 }
			 for (Map.Entry<Integer,List<Integer>> entry:map1.entrySet()) {
				List<Integer> list1=map.getOrDefault(entry.getKey(),new ArrayList<>());
				Collections.sort(entry.getValue());
				list1.addAll(entry.getValue());
				map.put(entry.getKey(),list1);
			}
			map1.clear(); 
		 }
		 for (Map.Entry<Integer,List<Integer>> listEntry:map.entrySet()) {
			list.add(listEntry.getValue());
		 }
		 return list;
	 }
	 class Node{
		 TreeNode node;
		 int col;
		 Node(TreeNode node,int col) {
			 this.node=node;
			 this.col=col;
		 }
	 }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惠菁

跪求一键三联

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值