https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree/
給定二叉樹,按垂序遍歷返回其結點值。
對位於 (X, Y)
的每個結點而言,其左右子結點分別位於 (X-1, Y-1)
和 (X+1, Y-1)
。
把一條垂線從 X = -infinity
移動到 X = +infinity
,每當該垂線與結點接觸時,我們按從上到下的順序報告結點的值( Y
座標遞減)。
如果兩個結點位置相同,則首先報告的結點值較小。
按 X
座標順序返回非空報告的列表。每個報告都有一個結點值列表。
示例 1:
輸入:[3,9,20,null,null,15,7] 輸出:[[9],[3,15],[20],[7]] 解釋: 在不喪失其普遍性的情況下,我們可以假設根結點位於 (0, 0): 然後,值爲 9 的結點出現在 (-1, -1); 值爲 3 和 15 的兩個結點分別出現在 (0, 0) 和 (0, -2); 值爲 20 的結點出現在 (1, -1); 值爲 7 的結點出現在 (2, -2)。
示例 2:
輸入:[1,2,3,4,5,6,7] 輸出:[[4],[2],[1,5,6],[3],[7]] 解釋: 根據給定的方案,值爲 5 和 6 的兩個結點出現在同一位置。 然而,在報告 "[1,5,6]" 中,結點值 5 排在前面,因爲 5 小於 6。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
struct node {
int x,y,val;
};
vector<node> vn;
static bool cmp(node & a1,node & a2) {
if(a1.x!=a2.x)
return a1.x<a2.x;
else if(a1.y!=a2.y)
return a1.y>a2.y;
else return a1.val<a2.val;
}
vector<vector<int>> verticalTraversal(TreeNode* root) {
dfs(0,0,root);
vector<vector<int> > res;
sort(vn.begin(),vn.end(),cmp);
if(vn.size()>0)
{
int t=vn[0].x;
vector<int> tmp;
tmp.push_back(vn[0].val);
for(int i=1; i<vn.size(); i++) {
if(vn[i].x==t) {
tmp.push_back(vn[i].val);
} else {
res.push_back(tmp);
tmp.clear();
t=vn[i].x;
tmp.push_back(vn[i].val);
}
}
res.push_back(tmp);
}
return res;
}
void dfs(int x,int y,TreeNode* root) {
if(root!=NULL) {
node t;
t.x=x;
t.y=y;
t.val=root->val;
vn.push_back(t);
if(root->left!=NULL) {
dfs(x-1,y-1,root->left);
}
if(root->right!=NULL) {
dfs(x+1,y-1,root->right);
}
}
}
};