搜索+哈希/平衡树,LeetCode 987. 二叉树的垂序遍历

目录

一、题目

1、题目描述

2、接口描述

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。

对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1) 。树的根结点位于 (0, 0) 。

二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。

返回二叉树的 垂序遍历 序列。

2、接口描述

/**
 * 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:
    vector<vector<int>> verticalTraversal(TreeNode* root) {

    }
};

3、原题链接

987. 二叉树的垂序遍历


二、解题报告

1、思路分析

我们由父节点的坐标可以推出左右孩子的坐标,那么我们可以从根节点进行广搜或者深搜,推出所有节点的坐标,然后对每一列按照行坐标和节点值进行排序,记录返回值即可

思路很简单,就是一模拟题,代码或许还可以写的更优雅。

2、复杂度

时间复杂度: O(nlogn)空间复杂度:O(n)

3、代码详解

/**
 * 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:
#define mkp make_pair
typedef TreeNode Node;
typedef pair<int,int> PII;
map<int, vector<PII>> mp;
set<int> cols;

    vector<vector<int>> verticalTraversal(TreeNode* root) {
        if(!root) return {};
        mp.clear(), cols.clear();
        function<void(Node*, const PII&)> dfs = [&](Node* x, const PII& p){
            mp[p.second].emplace_back(mkp(p.first, x->val));
            cols.insert(p.second);
            if(x->left) dfs(x->left, mkp(p.first+1, p.second-1));
            if(x->right) dfs(x->right, mkp(p.first+1, p.second+1));
        };
        dfs(root, mkp(0, 0));
        vector<vector<int>> ret(cols.size());
        int tot = 0;
        for(auto x : cols){
            sort(mp[x].begin(), mp[x].end());
            for(auto& p : mp[x])
                ret[tot].emplace_back(p.second);
            tot++;
        }
        return ret;
    }
};

相关推荐

  1. 搜索+/平衡LeetCode 987.

    2024-02-20 05:38:03       34 阅读
  2. 【力扣每日一题】力扣987

    2024-02-20 05:38:03       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-20 05:38:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-20 05:38:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-20 05:38:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-20 05:38:03       20 阅读

热门阅读

  1. 大数据经责审计

    2024-02-20 05:38:03       35 阅读
  2. the file size exceeds the configured limit Android studio

    2024-02-20 05:38:03       24 阅读
  3. c++ %运算符

    2024-02-20 05:38:03       27 阅读
  4. 2024前端面试准备之Vue3篇

    2024-02-20 05:38:03       36 阅读
  5. docker的底层原理一:客户端-服务器架构

    2024-02-20 05:38:03       31 阅读
  6. LeetCode--2298. 周末任务计数

    2024-02-20 05:38:03       29 阅读
  7. LeetCode刷题小记 一、【数组】

    2024-02-20 05:38:03       29 阅读