30 Day Challenge Day 4 | Hackrank - Tree : Top View
阿新 • • 發佈:2020-08-19
題解
俯視角度下觀察結果,我想到用root作為基準,令其序號為0,相應的,左節點在根節點基礎上序號減一,而右節點加一。
用一個佇列,自上而下逐層遍歷。因為觀察角度是從上往下,上層的節點會遮住同一列的下層所有節點。一邊往下,一遍往左右兩側探索,遇到水平方向更遠的節點都要儲存到結果中。
void topView(Node * root) { // Take root position as a base, move left -1, move right +1 if(!root) return; vector<int> leftward, rightward; queue<pair<Node*, int>> q; q.push({root, 0}); while(!q.empty()) { int size = q.size(); for(int i = 0; i < size; i++) { pair<Node*, int> n = q.front(); q.pop(); if(n.second < 0 && leftward.size() < abs(n.second)) { leftward.push_back(n.first->data); } else if(n.second > 0 && rightward.size() < abs(n.second)) { rightward.push_back(n.first->data); } if(n.first->left) { q.push({n.first->left, n.second - 1}); } if(n.first->right) { q.push({n.first->right, n.second + 1}); } } } for(int i = leftward.size()-1; i >= 0; i--) { cout << leftward[i] << " "; } cout << root->data << " "; for(int i = 0; i < rightward.size(); i++) { cout << rightward[i] << " "; } return; }