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两种思想。

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