題目 描述
給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。
示例:
輸入: [1,2,3,null,5,null,4]
輸出: [1, 3, 4]
解釋:
1 <---
/ \
2 3 <---
\ \
5 4 <---
思路
我的想法很簡單:
層次遍歷:層次遍歷的具體代碼借用一個隊列實現(請大家自行查詢)。在層次遍歷過程中引入一個特殊節點“#”(代碼中我用nullptr表示,詳情見後面代碼):用來表示這一層的遍歷結束。於是我們想要的下一個數就是遇到#之前最後一個非#的節點,因爲右視圖肯定看到的是每層遍歷的最後一個節點。(如果有類似題目,比如二叉樹的左視圖,那麼我們完全可以使用同樣的方法。修改的部門就是從右往左層次遍歷,然後遍歷完畢一層插入一個#)。
其他方法均和二叉樹層次遍歷相同。其中在遇到“#”這個節點的時候,處理有一些小小的注意點:
- 遇到#時:說明該層遍歷結束,這個時候應該把這個節點從隊列頭front彈出來,然後在隊列尾部back插入一個“#”,這時候要額外定義一個指針last用來保存上一次遇到的非#節點。
- 當把所有的二叉樹節點遍歷完畢之後,遇到最後一個#時,不能再按照上述情況(頭front彈出一個#,尾插back一個#),這樣再遍歷完二叉樹節點的時候容易死循環,導致一邊front彈出一直back插入。所以要增加一條判斷語句:判斷隊列的大小爲1時且隊列頭部front就是#時立即跳出循環。
廢話少說了,大家可以看代碼(歡迎大家監督,投稿,star,交流技術):Leetcode-199:二叉樹右視圖
vector<int> rightSideView(TreeNode* root) {
TreeNode* p=root;
deque<TreeNode*> queue1;
vector<int> res;
if(p==nullptr){
return res;
}
queue1.push_back(p);
queue1.push_back(nullptr);
TreeNode* last;
while(!queue1.empty()){
TreeNode* temp=queue1.front();
if(temp==nullptr)
{
res.push_back(last->val);
queue1.pop_front();//把空節點彈出
queue1.push_back(nullptr);
if(queue1.size()==1&&queue1.front()==nullptr){
break;
}
}
else
{
last = temp;
queue1.pop_front();
if(temp->left!=nullptr){
queue1.push_back(temp->left);
}
if(temp->right!=nullptr)
{
queue1.push_back(temp->right);
}
}
}
return res;
}