leetcode-199 解析 C++

題目 描述

給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。

示例:

輸入: [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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章