515. Find Largest Value in Each Tree Row(DFS)

题目:查找每层的最大值,保存到vector中

先说一下一开始我的bug,我一开始的思路是把vector都初始化为0,然后再一个个替换掉,那么这就会出现超时问题!!后面修改了一下,不初始化vector,而是将容器大小与当前节点层数比较,如果小于当前节点层数,就插入当前节点的值。

/**
 * 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) {
        vector<int> value;
        if(!root)
            return value;
        findLevelLargestValue(root,0,value);
        return value;
    }
    
    void findLevelLargestValue(TreeNode * root,int depth,vector<int>& value){
        if(!root)
            return;
        
        if(depth>=value.size())
        {
            value.push_back(root->val);
        }
        else
        {
            if(root->val>value[depth])
            {
                value[depth]=root->val;
            }
        }
            
        findLevelLargestValue(root->left,depth+1,value);
        findLevelLargestValue(root->right,depth+1,value);
        
    }
};

下面是leedcode上大神的解法,空间复杂度为O(1),采用的是Morris Traversal

class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        vector<int> res;
        TreeNode* cur = root, *prev = NULL;
        int deep = 0;
        while (cur) {
            if (cur->left == NULL) {
                //
                if (deep >= res.size())
                    res.push_back(cur->val);
                else
                    res[deep] = max(res[deep], cur->val);
                cur = cur->right;
                deep++;
            } else {
                prev = cur->left;
                int move = 1;
                while (prev->right && prev->right != cur) {
                    prev = prev->right;
                    move++;
                }
                if (prev->right == NULL) {
                    if (deep >= res.size())
                        res.push_back(cur->val);
                    prev->right = cur;
                    cur = cur->left;
                    deep++;
                } else {
                    // back to parent node, remove connection
                    prev->right = NULL;
                    deep -= move + 1;
                    //
                    if (deep >= res.size())
                        res.push_back(cur->val);
                    else
                        res[deep] = max(res[deep], cur->val);
                    cur = cur->right;
                    deep++;
                }
            }
        }
        return res;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 9,880评论 1 14
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,473评论 11 349
  • 每次坐在车上,我都有一个愿望,希望这辆不管是什么车能一直驶下去,一直到不了终点。 后来看到一部台湾偶像电影,男主彭...
    星期八的旧梦阅读 1,072评论 0 0
  • 丢了你的消息 好久都找不到 开启心灵的钥匙 时光尘封了记忆 岁月碾轧过相思 隔着山高水长 穿沙越海 在第1001夜...
    馮雁阅读 1,326评论 4 0
  • 就这样吧,你只是不甘心,你只是不甘愿,你只是不情愿,曾经他的温暖,他的温柔,他的柔情,现在都放在另一个她身上。只是...
    Lucy_Wu阅读 1,261评论 0 0