LC 314. Binary Tree Vertical Order Traversal

题目描述

Leetcode 314
给定一个二叉树,将垂直位置上同一列的所有节点整合成一个集合,并按照列的左右位置从左到右返回所有集合,同一列的集合中元素顺序保证,从上到下,从左到右。如果两个节点同行同列,按照从左到右依次返回。

题目思路

首先我们需要给每一个节点加入一个列的属性,我们把root作为column=0 root左边的节点列数为负数,root右边的节点列数为正,通过BFS遍历所有节点,每一次加入新节点进队列时,计算他所在列的值。然后每一次出队列进行处理时把该节点插入对应hashmap中,最后根据column值从小到大把每一个集合加入最后结果。

代码如下

这里使用有序hashmap保存每一列对应集合

class Solution {
public:
    vector<vector<int>> verticalOrder(TreeNode* root) {
        vector<vector<int>> res;
        if (!root) return res;

        // 保存每一个col对应的节点值,从上到下,从左到右顺序
        map<int, vector<int>> mp;
        // BFS逐层遍历每层从左到右遍历,所以如果相同row,col一定左比右靠前
        queue<pair<TreeNode*, int>> q;
        q.push({root, 0});

        while(!q.empty()) {
            //遍历
            auto cur = q.front(); q.pop();
            int col = cur.second;
            mp[col].push_back(cur.first->val);
            if (cur.first->left) q.push({cur.first->left, col-1});
            if (cur.first->right) q.push({cur.first->right, col+1});
        }

        // 遍历map
        for (auto &[k, v] : mp) res.push_back(move(v)); // move操作是将map中v移动到res中然后删除map中v
        return res;
    }
};

时间复杂度: O ( K l o g K + N ) \mathcal{O}(KlogK + N) O(KlogK+N) - K代表列数,每一次插入有序map LogK,一共插入K次,后一项是加上BFS遍历所有节点N的时间
空间复杂度: O ( N ) \mathcal{O}(N) O(N) - 队列中的节点 + 有序hashmap的空间

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值