【发布时间】:2021-02-16 19:36:09
【问题描述】:
我正在尝试对二叉树进行垂直顺序遍历,这个问题:https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/
我的方法:我对树中的每个节点进行深度优先搜索,其中根为 0。左边的任何内容都是当前根 - 1,右边的任何内容都是当前root + 1。我还有一个 HashMap,其中键是节点的值(具有相同位置匹配的节点),值是具有相同位置的所有 TreeNode 的链表(键值)。
当我打印出 HashMap 的值时,我看到它有正确的元素组合在一起。
问题是当我返回最终列表时,整数列表的顺序不正确,应该从最大的负数到最大的正数 - 相反,与根相同位置的元素被打印出来第一的。我认为这是因为我不能使用负数作为 HashMap 的键——但我想不出办法。
例如:
如果输入树是:
程序应该返回:[[9], [3,15], [20], [7]]
然而,我的回报:[[3,15], [9], [20], [7]]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> verticalTraversal(TreeNode root) {
/*dfs getting value of node & adding it to list*/
List<List<Integer>> list = new ArrayList<>();
Map<Integer, List<Integer>> map = new HashMap<>();
if(root == null) {
return list;
}
dfs(root, map, 0);
for(Map.Entry<Integer, List<Integer>> m : map.entrySet()) {
List<Integer> temp = new ArrayList<>();
for(int i : m.getValue()) {
temp.add(i);
}
list.add(temp);
}
return list;
}
public static void dfs(TreeNode root, Map<Integer, List<Integer>> map, int curVal) {
if(root == null) {
return;
}
// System.out.println("root val = " + root.val);
// System.out.println("curVal = " + curVal);
if(map.containsKey(curVal)) {
List temp = map.get(curVal);
temp.add(root.val);
map.put(curVal, temp);
}
else {
List<Integer> tempList = new ArrayList<>();
tempList.add(root.val);
map.put(curVal, tempList);
}
dfs(root.left, map, curVal - 1);
dfs(root.right, map, curVal + 1);
}
}
【问题讨论】:
标签: java tree binary-tree tree-traversal