987. Vertical Order Traversal of a Binary Tree

    xiaoxiao2026-05-05  6

    987. Vertical Order Traversal of a Binary Tree

    方法1: map + set Given a binary tree, return the vertical order traversal of its nodes values.

    For each node at position (X, Y), its left and right children respectively will be at positions (X-1, Y-1) and (X+1, Y-1).

    Running a vertical line from X = -infinity to X = +infinity, whenever the vertical line touches some nodes, we report the values of the nodes in order from top to bottom (decreasing Y coordinates).

    If two nodes have the same position, then the value of the node that is reported first is the value that is smaller.

    Return an list of non-empty reports in order of X coordinate. Every report will have a list of values of nodes.

    Example 1:

    Input: [3,9,20,null,null,15,7] Output: [[9],[3,15],[20],[7]] Explanation: Without loss of generality, we can assume the root node is at position (0, 0): Then, the node with value 9 occurs at position (-1, -1); The nodes with values 3 and 15 occur at positions (0, 0) and (0, -2); The node with value 20 occurs at position (1, -1); The node with value 7 occurs at position (2, -2). Example 2:

    Input: [1,2,3,4,5,6,7] Output: [[4],[2],[1,5,6],[3],[7]] Explanation: The node with value 5 and the node with value 6 have the same position according to the given scheme. However, in the report “[1,5,6]”, the node value of 5 comes first since 5 is smaller than 6.

    Note:

    The tree will have between 1 and 1000 nodes.Each node’s value will be between 0 and 1000.

    方法1: map + set

    思路:

    用两重treemap来排序x坐标和y坐标,并且用set将同一位置的val按从小到大的顺序排列。在主函数中将这个数据结构变成vector返回。

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int>> verticalTraversal(TreeNode* root) { vector<vector<int>> result; map<int, map<int, set<int>>> hash; verticalHelper(root, hash, 0, 0); for (auto a: hash) { vector<int> tmp; for (auto b: a.second) { for (int n: b.second) { tmp.push_back(n); } } result.push_back(tmp); } return result; } void verticalHelper(TreeNode* root, map<int, map<int, set<int>>> & hash, int level, int height) { if (!root) return; hash[level][height].insert(root -> val); verticalHelper(root -> left, hash, level - 1, height + 1); verticalHelper(root -> right, hash, level + 1, height + 1); return; } };
    最新回复(0)