Skip to content

[LeetCode] 987. Vertical Order Traversal of a Binary Tree #57

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
frdmu opened this issue Jul 31, 2021 · 0 comments
Open

[LeetCode] 987. Vertical Order Traversal of a Binary Tree #57

frdmu opened this issue Jul 31, 2021 · 0 comments

Comments

@frdmu
Copy link
Owner

frdmu commented Jul 31, 2021

Given the root of a binary tree, calculate the vertical order traversal of the binary tree.

For each node at position (row, col), its left and right children will be at positions (row + 1, col - 1) and (row + 1, col + 1) respectively. The root of the tree is at (0, 0).

The vertical order traversal of a binary tree is a list of top-to-bottom orderings for each column index starting from the leftmost column and ending on the rightmost column. There may be multiple nodes in the same row and same column. In such a case, sort these nodes by their values.

Return the vertical order traversal of the binary tree.

 

Example 1:
vtree1

Input: root = [3,9,20,null,null,15,7]
Output: [[9],[3,15],[20],[7]]
Explanation:
Column -1: Only node 9 is in this column.
Column 0: Nodes 3 and 15 are in this column in that order from top to bottom.
Column 1: Only node 20 is in this column.
Column 2: Only node 7 is in this column.

Example 2:
vtree2

Input: root = [1,2,3,4,5,6,7]
Output: [[4],[2],[1,5,6],[3],[7]]
Explanation:
Column -2: Only node 4 is in this column.
Column -1: Only node 2 is in this column.
Column 0: Nodes 1, 5, and 6 are in this column.
          1 is at the top, so it comes first.
          5 and 6 are at the same position (2, 0), so we order them by their value, 5 before 6.
Column 1: Only node 3 is in this column.
Column 2: Only node 7 is in this column.

Example 3:
vtree3

Input: root = [1,2,3,4,6,5,7]
Output: [[4],[2],[1,5,6],[3],[7]]
Explanation:
This case is the exact same as example 2, but with nodes 5 and 6 swapped.
Note that the solution remains the same since 5 and 6 are in the same location and should be ordered by their values.

Constraints:

  • The number of nodes in the tree is in the range [1, 1000].
  • 0 <= Node.val <= 1000


解法:
遍历+排序。没啥好说的。代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    struct node {
        int row;
        int col;
        int val; 
    };
    vector<node> vec;
    void preOrder(TreeNode* root, int row, int col) {
        if (!root) return;

        vec.push_back({row, col, root->val});
        preOrder(root->left, row+1, col-1);
        preOrder(root->right, row+1, col+1);
    }
    bool static cmp(node a, node b) {
        if (a.col < b.col) return true;
        if (a.col == b.col) {
            if (a.row < b.row) {
                return true;
            }
            if (a.row == b.row) {
                if (a.val < b.val)
                    return true;
            }
        }
        return false;
    }
    vector<vector<int>> verticalTraversal(TreeNode* root) {
        vector<vector<int>> res;
        
        preOrder(root, 0, 0);
        sort(vec.begin(), vec.end(), cmp);
        int n = vec.size();
        vector<int> tmp{vec[0].val};
        int c = vec[0].col; 
        for (int i = 1; i < n; i++) {
            if (vec[i].col == c) {
                tmp.push_back(vec[i].val);
            } else {
                res.push_back(tmp);
                tmp.clear();
                c = vec[i].col;
                tmp.push_back(vec[i].val);
            }
        }
        res.push_back(tmp);

        return res;
    }
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant