打印二叉樹的右視圖


解法一: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);
    }

顯然,右視圖改變一下遍歷順序就可以了。

 

參考鏈接:

1. https://leetcode-cn.com/problems/binary-tree-right-side-view/solution/you-xian-you-zi-shu-de-shen-du-bian-li-qing-xi-gao/

2. https://leetcode-cn.com/problems/binary-tree-right-side-view/solution/er-cha-shu-de-you-shi-tu-by-leetcode/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM