代码随想录算法训练营第十六天 | LeetCode 104、559、111、222


前言

LeetCode题目:LeetCode 104、559、111、222
Takeaway:和昨天的内容基本差不多,甚至有一样的题,还是标准的,要理解各种二叉树遍历的放法(先、中、后、层序遍历),以及递归三部曲:先确定返回值和参数,再确定递归出口,最后是每层的递归处理。


一、104

昨天就做过的题,没什么好说的,使用队列进行层序遍历就能轻松解决。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        queue<TreeNode*> que;
        if(root != NULL){
            que.push(root);
        }
        TreeNode* cur = root;

        int resLevel = 0;

        while(que.size() != 0){

            resLevel++;

            // 这个size用的非常好,可以使用size来确定每层多少个元素
            int size = que.size();
            
            for(int i=0;i<size;i++){
                cur = que.front();
                que.pop();
                
                if(cur->left!=NULL){
                    que.push(cur->left);
                }
                if(cur->right!=NULL){
                    que.push(cur->right);
                }
            }
            
        }

        return resLevel;
    }
};


二、559

和上一道题的逻辑一模一样,唯一的区别是这次遍历所有子节点,而不是只有两个子节点。

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    int maxDepth(Node* root) {
        queue<Node*> que;
        if(root != NULL){
            que.push(root);
        }
        Node* cur = root;

        int resLevel = 0;

        while(que.size() != 0){

            resLevel++;

            // 这个size用的非常好,可以使用size来确定每层多少个元素
            int size = que.size();
            
            for(int i=0;i<size;i++){
                cur = que.front();
                que.pop();
                
                for(int i=0; i<cur->children.size(); i++){
                    que.push(cur->children[i]);
                }
            }
        }
        return resLevel;
    }
};

三、111

仍然是昨天就做过的题,和第一题一个路子就能做出来,第一题是找到底为止,这个是找到第一次没有左右子节点就为止。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<TreeNode*> que;
        if(root != NULL){
            que.push(root);
        }
        TreeNode* cur = root;

        int resLevel = 0;

        while(que.size() != 0){

            resLevel++;

            // 这个size用的非常好,可以使用size来确定每层多少个元素
            int size = que.size();
            
            for(int i=0;i<size;i++){
                cur = que.front();
                que.pop();
                
                if(cur->left!=NULL){
                    que.push(cur->left);
                }
                if(cur->right!=NULL){
                    que.push(cur->right);
                }
                
                // 最浅就在这
                if(cur->left == NULL && cur->right ==NULL){
                    return resLevel;
                }
            }
        }
        return resLevel;
    }
};

四、222

这题是今天这四道题里面唯一一个没做过的,但仍然比较简单(我真不知道这个凭什么是middle,kmp却是easy?),最简单的解法就是不考虑它是完全二叉树,而是按照它是普通二叉树的逻辑来做,递归会非常好写。但是这里我的解法是考虑到题里给出的:这棵树是完全二叉树的解法,相对复杂一点点,主要是递归出口有点多,别的都没什么。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    int sum;

    int findNodes(TreeNode* root) {
        if(root == NULL){
            return 0;
        }
        int leftDepth = 0;
        int rightDepth = 0;

        TreeNode* cur = root;

        while(cur!=NULL){
            cur = cur->left;
            leftDepth++;
        }

        while(cur!=NULL){
            cur = cur->right;
            rightDepth++;
        }

        if(leftDepth == rightDepth){
            return pow(2, leftDepth+1)-1;
        }

        // 上面全是递归出口,下面才是内部逻辑
        else{
            int leftNum = findNodes(root->left);
            int rightNum = findNodes(root->right);
            return leftNum+rightNum+1;
        }
    }

    int countNodes(TreeNode* root) {
        int sum = findNodes(root);
        return sum;
    }
};

总结

昨天刷的多了,今天很多题都是重复的,所以比较简单就搞定了,非要说有什么进步,那就是递归写的越来越流畅了,递推的思路也清晰了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值