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. 二叉树的垂序遍历的主要内容,如果未能解决你的问题,请参考以下文章