【发布时间】:2020-08-10 23:11:14
【问题描述】:
伪代码
-
创建了一个类来保存节点及其水平高度
-
使用 BFS,因此创建一个队列并插入第一个水平高度为 0 的节点
-
从队列中弹出元素,如果地图中不存在水平高度,则为其创建一个条目
-
获取水平高度的ArrayList并将节点的值添加到其中
-
检查左右孩子,如果不为空则将它们添加到队列中
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; }}
问题 输入失败
【问题讨论】:
-
if(tmp.key.left!=null) q.add(new Node(tmp.key.left,tmp.h-1));不应该是tmp.h+1吗? -
不,它就像一个数字线。如果一个节点在 n 高度,那么左边是 n-1,右边是 n+1
-
那不是水平高度吗?想象一下垂直线与水平线。垂直高也是树中节点的高 - 从下到上。而水平高度是节点从左到右的位置,就像您的任务一样。
-
是的,是诺伯特。感谢您的澄清,我已经更新了问题
标签: java binary-tree breadth-first-search tree-traversal