vlambda博客
学习文章列表

【递归】987. 二叉树的垂序遍历(困难)

让我们先来看看这道题目的描述

这道题目思路比较简单

遍历这棵树,记录每一个节点的所在的列位置,所在的行位置,以及这个节点的值,根据先考虑列,再考虑行,最后再考虑节点的value进行排序

按照不同的列,进行分组,最后返回答案



/** * 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) { List<List<Integer>> ans = new ArrayList<>(); List<int[]> info = new ArrayList<>(); save(root, 0, 0, info); Collections.sort(info, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { if(o1[0] != o2[0]) return o1[0] - o2[0]; else if(o1[1] != o2[1]) return o1[1] - o2[1]; else return o1[2] - o2[2]; } }); int visited = Integer.MIN_VALUE; for(int[] in : info){ if(in[0] != visited){ visited = in[0]; ans.add(new ArrayList<>()); } ans.get(ans.size() - 1).add(in[2]);        } return ans; }
private void save(TreeNode node, int col, int row, List<int[]> info){ if(node == null) return; info.add(new int[] {col, row, node.val}); save(node.left, col - 1, row + 1, info); save(node.right, col + 1, row + 1, info);
}}


也可以用一张哈希表来存储节点和对应的信息,因为二叉树遍历后,哈希表的key将不再被使用,所以不用哈希表也可以~