1. 程式人生 > >[LeetCode] Binary Tree Vertical Order Traversal 二叉樹的豎直遍歷

[LeetCode] Binary Tree Vertical Order Traversal 二叉樹的豎直遍歷

Given a binary tree, return the vertical order traversal 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 from left to right.

Examples:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its vertical order traversal as:

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

Given binary tree [3,9,20,4,5,2,7],

    _3_
   /   \
  9    20
 / \   / \
4   5 2   7

return its vertical order traversal as:

[
  [4],
  [9],
  [3,5,2],
  [20],
  [7]
]

這道題讓我們豎直遍歷二叉樹,並把每一列存入一個二維陣列,我們看題目中給的第一個例子,3和15屬於同一列,3在前,第二個例子中,3,5,2在同一列,3在前,5和2緊隨其後,那麼我們隱約的可以感覺到好像是一種層序遍歷的前後順序,那麼我們如何來確定列的順序呢,我們可以把根節點給個序號0,然後開始層序遍歷,凡是左子節點則序號減1,右子節點序號加1,這樣我們可以通過序號來把相同列的節點值放到一起,我們用一個TreeMap來建立序號和其對應的節點值的對映,用TreeMap的另一個好處是其自動排序功能可以讓我們的列從左到右,由於層序遍歷需要用到queue,我們此時queue裡不能只存節點,而是要存序號和節點組成的pair,這樣我們每次取出就可以操作序號,而且排入隊中的節點也賦上其正確的序號,程式碼如下:

class Solution {
public:
    vector<vector<int>> verticalOrder(TreeNode* root) {
        vector<vector<int>> res;
        if (!root) return res;
        map<int, vector<int>> m;
        queue<pair<int, TreeNode*>> q;
        q.push({0, root});
        
while (!q.empty()) { auto a = q.front(); q.pop(); m[a.first].push_back(a.second->val); if (a.second->left) q.push({a.first - 1, a.second->left}); if (a.second->right) q.push({a.first + 1, a.second->right}); } for (auto a : m) { res.push_back(a.second); } return res; } };

類似題目:

參考資料: