如何解决二叉树垂直顺序遍历中具有相同水平高度和相同垂直高度的元素的问题
伪代码
-
创建了一个包含节点及其水平高度的类
-
使用BFS,因此创建一个队列并插入水平高度为0的第一个节点
-
从队列中放入元素,如果地图中不存在水平高度,则为其创建一个条目
-
获取水平高度的ArrayList并将节点的值添加到其中
-
检查左侧和右侧子级,如果它们不为null,则将其添加到队列中
class Solution { class Node{ TreeNode key; int h; Node(TreeNode key,int h){ this.key=key; this.h=h; } } public List<List<Integer>> verticalTraversal(TreeNode root) { if(root==null) return null; TreeMap<Integer,ArrayList<Integer>> map = new TreeMap<>(); Queue<Node> q=new LinkedList<>(); q.add(new Node(root,0)); while(!q.isEmpty()){ Node tmp=q.poll(); if(!map.containsKey(tmp.h)) map.put(tmp.h,new ArrayList<Integer>()); map.get(tmp.h).add(tmp.key.val); if(tmp.key.left!=null) q.add(new Node(tmp.key.left,tmp.h-1)); if(tmp.key.right!=null) q.add(new Node(tmp.key.right,tmp.h+1)); } List<List<Integer>> ans=new ArrayList<>(); for(ArrayList<Integer> al:map.values()){ ans.add(al); } return ans; }
}
问题 输入失败
输入: [0,2,1,3,null,null,null,4,5,null,7,6,null,10,8,11,9]
解决方法
首先,您可能正在谈论水平高度,而不是输出所建议的垂直高度。您得到的输出似乎是正确的,因为在进行BFS遍历时,您首先在水平高度上独立地从左元素开始,然后从右到右查找元素。树级别的左节点将始终被更快地处理(因此,其子级也将被更快地添加到队列中),因此在级别3(从0到从下到下索引)处,值7的节点将被更快地添加到队列中进行处理然后是值6的节点。因此,在我眼中输出似乎是正确的,您能告诉我们为什么您期望获得不同的输出吗?
根据任务链接(https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/)中的这句话:
“如果两个节点的位置相同,那么首先报告的节点的值就是较小的值。”
似乎您需要对结果列表中的子列表进行排序。您可以使用以下代码来做到这一点:
sortedResult = resultList.stream()
.map(list -> list.stream().sorted().collect(Collectors.toList()))
.collect(Collectors.toList());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。