思路:这题已经给出提示了,所有的二叉树节点都可以用坐标表示。那么我们只需要DFS遍历一遍给所有节点标记对应的坐标并且加入到一个集合里,然后按照要求的排序方式输出就好啦
struct node//节点值以及对应的坐标位置
{
int val;
int x;
int y;
node(int i_val, int i_x,int i_y):val(i_val),x(i_x),y(i_y){};
};
static bool cmp(node a,node b)
{
////排序方式:先按X值升序,x值相同再按y值升序,最后y值相同按val升序
if(a.x^b.x)//^是异或符号,代表两个值不相同
return a.x<b.x;
if(a.y^b.y)
return a.y<b.y;
return a.val<b.val;
}
vector<node> nodeArr;
int minX=INT_MAX;
int maxX=INT_MIN;
vector<vector<int>> verticalTraversal(TreeNode* root)
{
dfs(root,0,0);//遍历标记坐标
sort(nodeArr.begin(),nodeArr.end(),cmp);//排序遍历
vector<vector<int>> res(maxX-minX+1);
for(node son:nodeArr)
{
res[son.x-minX].push_back(son.val);
}
return res;
}
void dfs(TreeNode* root,int x,int y)
{
if(root==nullptr) return;
if(x<minX)
minX=x;
if(x>maxX)
maxX=x;
nodeArr.push_back(node(root->val,x,y));
dfs(root->left,x-1,y+1);
dfs(root->right,x+1,y+1);
}