解法一:BFS+記錄dep深度
如果某節點dep小於下一個節點,說明該節點是本層的最右節點。如果該節點彈出后隊列為空,同樣該節點也是最右節點。
vector<int> rightSideView(TreeNode* root) { if(root == NULL) return vector<int>{}; vector<int>res; queue<pair<TreeNode*, int>>q; q.push(make_pair(root, 0)); while(!q.empty()) { TreeNode* p = q.front().first; int dep = q.front().second; q.pop(); if(q.empty() || dep < q.front().second) // 隊列為空說明該節點一定是最右節點(否則不可能為空) res.push_back(p->val); if(p->left != NULL) q.push(make_pair(p->left, dep+1)); if(p->right != NULL) q.push(make_pair(p->right, dep+1)); } return res; }
解法二:dfs
如果按照先根節點,再右子樹,再左子樹,那么觀察到一個結論:每當訪問到一個新深度,該節點就是最右節點。

vector<int>res; // 存儲最右節點 int max_dep = -1; // 當前最大深度 vector<int> rightSideView(TreeNode* root) { PostOrder(root, 0); return res; } void PostOrder(TreeNode* root, int dep) { if(root == NULL) return; if(dep > max_dep) { res.push_back(root->val); max_dep = dep; } PostOrder(root->right, dep+1); PostOrder(root->left, dep+1); }
顯然,右視圖改變一下遍歷順序就可以了。
參考鏈接:
