前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 314. 二叉树的垂直遍历(BFS/DFS)

LeetCode 314. 二叉树的垂直遍历(BFS/DFS)

作者头像
Michael阿明
发布2021-02-19 10:50:41
8530
发布2021-02-19 10:50:41
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

给定一个二叉树,返回其结点 垂直方向(从上到下,逐列)遍历的值。

如果两个结点在同一行和列,那么顺序则为 从左到右

代码语言:javascript
复制
示例 1:
输入: [3,9,20,null,null,15,7]

   3
  /\
 /  \
9   20
    /\
   /  \
  15   7 

输出:
[
  [9],
  [3,15],
  [20],
  [7]
]

示例 2:
输入: [3,9,8,4,0,1,7]

     3
    /\
   /  \
  9    8
  /\   /\
 /  \ /  \
4   0 1   7 

输出:
[
  [4],
  [9],
  [3,0,1],
  [8],
  [7]
]

示例 3:
输入: [3,9,8,4,0,1,7,null,null,null,2,5]
(注意:0 的右侧子节点为 2,1 的左侧子节点为 5)

     3
    /\
   /  \
   9   8
  /\  /\
 /  \/  \
 4  01   7
    /\
   /  \
   5   2

输出:
[
  [4],
  [9,5],
  [3,0,1],
  [8,2],
  [7]
]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-vertical-order-traversal 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 DFS

  • 记录深度、横坐标,按横坐标存入map,取出来的时候按深度排序
代码语言:javascript
复制
class Solution {
	map<int, vector<pair<int,int>>> ans;
public:
    vector<vector<int>> verticalOrder(TreeNode* root) {
        dfs(root, 0, 0);
        vector<vector<int>> res;
        for(auto& a : ans)
        {	//按横坐标取出
        	sort(a.second.begin(), a.second.end(),[&](auto a, auto b){
                return a.first < b.first;//按深度排序
            });
            vector<int> temp;
            for(auto& d_val : a.second)
                temp.push_back(d_val.second);
        	res.push_back(temp);
        }
        return res;
    }
    void dfs(TreeNode* root, int x, int deep)
    {
    	if(!root) return;
    	ans[x].push_back({deep, root->val});//深度、val
    	dfs(root->left, x-1, deep+1);
    	dfs(root->right, x+1, deep+1);
    }
};

8 ms 8.7 MB

2.2 BFS

  • 只需记录x横坐标,存入map,从顶向下BFS层次遍历(保证从上到下的顺序)
代码语言:javascript
复制
class Solution {
public:
    vector<vector<int>> verticalOrder(TreeNode* root) {
    	if(!root) return {};
        vector<vector<int>> res;
        map<int,vector<int>> m;
        queue<pair<TreeNode*,int>> q;
        int size, x, val;
        TreeNode *cur;
        q.push({root, 0});
        while(!q.empty())
        {
        	size = q.size();
        	while(size--)
        	{
                cur = q.front().first;
        		val = cur->val;
        		x = q.front().second;
                q.pop();
        		m[x].push_back(val);
        		if(cur->left)
        			q.push({cur->left, x-1});
        		if(cur->right)
        			q.push({cur->right, x+1});
        	}
        }
        for(auto& mi : m)
            res.push_back(mi.second);
        return res;
    }
};

8 ms 8.1 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
    • 2.1 DFS
      • 2.2 BFS
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档