1. 程式人生 > 實用技巧 >leetcode314 - Binary Tree Vertical Order Traversal - medium

leetcode314 - Binary Tree Vertical Order Traversal - medium

Given a binary tree, return thevertical ordertraversal of its nodes' values. (ie, from top to bottom, column by column).

If two nodes are in the same row and column, the order should be fromleft to right.

Examples 1:

Input: [3,9,20,null,null,15,7]

   3
  /\
 /  \
 9  20
    /\
   /  \
  15   7 

Output:

[
  [9],
  [3,15],
  [20],
  [7]
]

Examples 2:

Input: [3,9,8,4,0,1,7]

     3
    /\
   /  \
   9   8
  /\  /\
 /  \/  \
 4  01   7 

Output:

[
  [4],
  [9],
  [3,0,1],
  [8],
  [7]
]

Examples 3:

Input: [3,9,8,4,0,1,7,null,null,null,2,5] (0's right child is 2 and 1's left child is 5)

     3
    /\
   /  \
   9   8
  /\  /\
 /  \/  \
 4  01   7
    /\
   /  \
   5   2

Output:

[
  [4],
  [9,5],
  [3,0,1],
  [8,2],
  [7]
]
觀察發現對於每個node如果它在vertical level k上那它的左子樹在level k-1, 右子樹k+1. level order traverse的同時,多記錄一欄track vertical order就好。 每個level用map來裝,這樣輸出的時候自動按從左到右排好了。 面經:print the top view of a binary tree 實現:Time O(nlogn) BFS-n, map-logn Space O(n)
class Solution {
public:
    vector<vector<int>> verticalOrder(TreeNode* root) {
        
        vector
<vector<int>> res; if (!root) return res; map<int, vector<int>> m; queue<pair<TreeNode*, int>> q; q.push({root, 0}); while (!q.empty()){ auto cur = q.front(); q.pop(); m[cur.second].push_back(cur.first->val); if (cur.first->left) q.push({cur.first->left, cur.second-1}); if (cur.first->right) q.push({cur.first->right, cur.second+1}); } for (auto& elem : m) res.push_back(elem.second); return res; } };