1. 程式人生 > 實用技巧 >30 Day Challenge Day 4 | Hackrank - Tree : Top View

30 Day Challenge Day 4 | Hackrank - Tree : Top View

題解

俯視角度下觀察結果,我想到用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;
    }