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

1. 题目

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

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

示例 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 的右侧子节点为 21 的左侧子节点为 53
    /\
   /  \
   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,取出来的时候按深度排序
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层次遍历(保证从上到下的顺序)
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


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/107825446