2020_12_22 LeetCode刷题

589. N叉树的前序遍历

递归回溯题。前序遍历为根节点,左子树节点,右子树节点。

/*
// 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:
    vector<int> preorder(Node* root) {
        vector<int> ans;
        predfsTree(root,ans);
        return ans;
    }
    void predfsTree(Node* root,vector<int>& ans) {
        if(root == nullptr)
            return;
        ans.push_back(root->val);
        int len1 = root->children.size();
        for(int i = 0; i < len1; i++)
            predfsTree(root->children[i],ans);
    }
};

590. N叉树的后序遍历

递归回溯题。后序遍历的顺序为左子树节点,右子树节点,根节点。

/*
// 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:
    vector<int> postorder(Node* root) {
        vector<int> ans;
        postdfsTree(root,ans);
        return ans;
    }
    void postdfsTree(Node* root,vector<int>& ans) {
        if(root == nullptr)
            return;
        int len1 = root->children.size();
        for(int i = 0; i < len1; i++)
            postdfsTree(root->children[i],ans);
        ans.push_back(root->val);
    }
};

598. 范围求和 II

简单模拟题。初始化所有的数组元素都为0,之后给在范围内的数+1,那么最大元素的个数其实就是增加次数最多的范围内的点,也就是需要找出所有的区间中的最小区间,由于所有的区间初始点从0开始,那么也就只需要找出两个数值,一个m和一个n的最小值,然后相乘就是结果。注意初始化的数值。

class Solution {
public:
    int maxCount(int m, int n, vector<vector<int>>& ops) {
        int min1 = m,min2 = n;
        int len1 = ops.size();
        for(int i = 0; i < len1 ;i++) {
            min1 = min(min1,ops[i][0]);
            min2 = min(min2,ops[i][1]);
        }
        return min1 * min2;
    }
};

 

606. 根据二叉树创建字符串

递归回溯题。这道题目没有在15min内完成,之后看了题解。模拟面试写的时候只是单纯的在递归函数中添加左右扩号,合法性想在得出了结果后再返回处理吗但是处理过程不对,就是右节点为空的情况,因为判定的时候处理合法性写法是当出现左右括号相邻,所以放弃了想法。分为四种情况,然后分别单独考虑得出答案。

/**
 * 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:
    string tree2str(TreeNode* t) {
        if(t == nullptr)
            return "";
        if(t->left == nullptr && t->right == nullptr)
            return to_string(t->val) + "";
        if(t->left != nullptr && t->right == nullptr)
            return to_string(t->val) + "(" + tree2str(t->left) +  ")";    
        return to_string(t->val) + "(" + tree2str(t->left) +  ")" + "(" + tree2str(t->right) +  ")";
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值