LeetCode515. Find Largest Value in Each Tree Row題解

1. 題目描述

You need to find the largest value in each row of a binary tree.

2. 樣例

這裏寫圖片描述

3. 分析

題目的意思很明確,給了一棵樹,需要我輸出一個數組,這個數組裏面存放着樹的每一層的最大元素的值。首先需要明確一點:result數組存放結果,那麼它的對應位置下標就是對應樹的層,例如result[1]就是放着第1層的最大元素(我們將根節點看作第0層)

3.1. 層次遍歷法

拿到這道題,我的第一個思路就是層次遍歷,屬於BFS的算法:即利用一個隊列queue,進行樹的層次遍歷。然而一個隊列進行層次遍歷只能保證遍歷,而無法保證找到每一層的最大值。因爲利用queue進行層次遍歷的時候,沒有一個標識來區分當前遍歷的節點是屬於哪一層的。因此,考慮到這些,我又開闢了一個queue,來存儲當前節點所屬的層。
這裏寫圖片描述
這裏寫圖片描述

3.2. DFS遞歸法

後來看了大佬們的算法,有人用DFS遞歸的方式進行遍歷,覺得很有意思,就仔細研究了一下思想:進行深度遍歷,直到葉子節點,不過在遍歷的同時有一個level變量記錄當前節點所在的層。
如果當前層數大於等於result的長度(其實我認爲最多隻可能相等,不會出現大於的情況),那麼就說明該層目前只有一個節點,那麼該節點的數值就一定要放進去。其他情況:說明該層至少一個節點被訪問過,我們要做的就是比較已經訪問過的節點和我們當前節點誰大誰小,取大的放入result的對應位置即可。
這裏寫圖片描述

4. 源碼

4.1. 層次遍歷法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        queue<TreeNode*> tree;
        queue<int> level;
        vector<int> result;
        TreeNode* current_node;
        int current_level = 0;
        int last_level = -1;
        if (root != NULL) {
            tree.push(root);
            level.push(current_level);
            while(!tree.empty()) {
                current_node = tree.front();
                current_level = level.front();
                tree.pop();
                level.pop();
                if (current_node->left != NULL) {
                    tree.push(current_node->left);
                    level.push(current_level+1);
                }
                if (current_node->right != NULL) {
                    tree.push(current_node->right);
                    level.push(current_level+1);
                }
                if (current_level > last_level) {
                    last_level = current_level;
                    result.push_back(current_node->val);
                }
                else {
                    last_level = current_level;
                    result[current_level] = max(result[current_level], current_node->val);
                }
            }
        }
        return result;
    }
};

4.2. DFS遞歸法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void DFS(TreeNode* root, int level, vector<int>& result) {
        if (root == NULL) {
            return;
        }
        /* 當前該層只有一個結點 */
        if (level >= (int)result.size()) {
            result.push_back(root->val);
        }
        else {
            /* 判斷當前層最大的結點 */
            if (result[level] <= root->val) {
                result[level] = root->val;
            }
        }
        DFS(root->left, level+1, result);
        DFS(root->right, level+1, result);
    }

    vector<int> largestValues(TreeNode* root) {
        vector<int> result;
        int level = 0;
        DFS(root, level, result);
        return result;
    }
};

5. 心得

這道題看起來簡單,而且對應難度是easy,通過率也不少,但是我還是學到了比較精妙的想法,並且利用了DFS和BFS兩種思想。

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