987. 二叉树的垂序遍历

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了987. 二叉树的垂序遍历相关的知识,希望对你有一定的参考价值。

987. 二叉树的垂序遍历

 


题目

传送门:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/


 


算法设计:深度优先搜索

因为返回顺序是,按列的。

所以,需要先给每个节点标上坐标。

void traverse(TreeNode root, int row = 0, int col = 0)   // 给每个节点标记坐标
    if (root == null) 
        return;
    print(row, col);
    traverse(root.left, row + 1, col - 1);
    traverse(root.right, row + 1, col + 1);

把这些坐标收集起来,依据题目要求进行排序,再组装成题目要求的返回数据格式。

  • 整体顺序:从最左列开始,到最右列结束 -> 首先根据 y 值从小到大排序
  • 列顺序:多节点同列,从上到下的升序 -> 其次根据 x 值从小到大排序
  • 局部顺序:同行同列有多节点,按节点值从小到大升序 -> 最后根据 val 值从小到大排序
struct Node 
    int x, y, val;
    Node() 
    Node(int a, int b, int c) : x(a), y(b), val(c) 
    bool operator < (Node node) const              // 重载 < 排序
        if(y != node.y) return y > node.y;          // 首先根据 y 值从小到大排序
        else if(x != node.x) return x > node.x;     // 其次根据 x 值从小到大排序
        return val > node.val;                      // 最后根据 val 值从小到大排序
    
;

完整代码:

class Solution 
public:
    struct Node 
        int x, y, val;
        Node() 
        Node(int a, int b, int c) : x(a), y(b), val(c) 
        bool operator < (Node node) const 
            if(y != node.y) return y > node.y;
            else if(x != node.x) return x > node.x;
            return val > node.val;
        
    ;

    map <int, priority_queue <Node> > ss;         // 优先队列排序
    vector <vector<int>> ans;

    void dfs(int x, int y, TreeNode *root) 
        if(!root) return ;
        ss[y].push(x, y, root->val);
        dfs(x + 1, y - 1, root->left);
        dfs(x + 1, y + 1, root->right);
        return ;
    

    vector<vector<int>> verticalTraversal(TreeNode* root) 
        if(!root) return ans;
        dfs(0, 0, root);
        for(auto &[x, y] : ss) 
            ans.push_back(vector<int>());
            while(!y.empty()) 
                ans.back().push_back(y.top().val);
                y.pop();
            
        
        return ans;
    
;

以上是关于987. 二叉树的垂序遍历的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 987. 二叉树的垂序遍历

二叉树的垂序遍历

591,二叉树的垂序遍历

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

987. 二叉树的垂序遍历

[H二叉树] lc987. 二叉树的垂序遍历(dfs+哈希表)