leetcode每日一题42

107.二叉树的层序遍历II

就层序遍历后reverse一下

cpp 复制代码
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        queue<TreeNode*> que;
        if(root!=nullptr)
            que.push(root);
        vector<vector<int>> result;
        while(!que.empty()){
            int size=que.size();
            vector<int> vec;
            for(int i=0;i<size;i++)
            {
                TreeNode* node=que.front();
                que.pop();
                vec.push_back(node->val);
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
            result.push_back(vec);
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

109. 有序链表转换二叉搜索树

先用快慢指针找中点,再递归构造二叉搜索树

类似二分

cpp 复制代码
class Solution {
public:
    ListNode* midNode(ListNode* left,ListNode* right){
        ListNode *fast,*slow;
        fast=left;
        slow=left;
        while(fast!=right&&fast->next!=right)
        {
            fast=fast->next;
            fast=fast->next;
            slow=slow->next;
        }
        return slow;
    }
    TreeNode* buildTree(ListNode* left,ListNode* right){
        if(left==right)
            return nullptr;
        ListNode* mid=midNode(left,right);
        TreeNode* root=new TreeNode(mid->val);
        root->left=buildTree(left,mid);
        root->right=buildTree(mid->next,right);
        return root;
        
    }
    TreeNode* sortedListToBST(ListNode* head) {
        
        return buildTree(head,nullptr);//左闭右开区间
    }
};

113. 路径总和 II

112是返回有没有总和为给定值的路径,这道题是返回所有总和为给定值的路径

因此要遍历整个树,找到所有路径,且不用处理递归返回值,所以递归函数不要返回值!

  1. 确定递归函数的参数和返回类型
    需要二叉树的根节点,还需要一个计数器,这个计数器用来计算二叉树的一条边之和是否正好是目标和,计数器为int型
cpp 复制代码
void traversal(TreeNode* cur, int count) 
  1. 确定终止条件
    让计数器count初始为目标和,然后每次减去遍历路径节点上的数值。
    如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。
    如果遍历到了叶子节点,count不为0,就是没找到。
cpp 复制代码
if(count==0&&!cur->left&&!cur->right){
	result.push_back(path);
	return;
}
else if (!cur->left && !cur->right)
	return;
  1. 确定单层递归的逻辑
    如果子节点不为空,加入path,count减去子节点值,递归,递归结束后,回溯,count加回来,去除path中的子节点
cpp 复制代码
if(cur->left)
{
    path.push_back(cur->left->val);
    count-=cur->left->val;
    traversal(cur->left,count);
    count+=cur->left->val;
    path.pop_back();
}
if(cur->right)
{
    path.push_back(cur->right->val);
    count-=cur->right->val;
    traversal(cur->right,count);
    count+=cur->right->val;
    path.pop_back();
}

整体代码

cpp 复制代码
class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void traversal(TreeNode* cur, int count) 
    {
        if(count==0&&!cur->left&&!cur->right){
            result.push_back(path);
            return;
        }
        else if (!cur->left && !cur->right)
            return;
        if(cur->left)
        {
            path.push_back(cur->left->val);
            count-=cur->left->val;
            traversal(cur->left,count);
            count+=cur->left->val;
            path.pop_back();
        }
        if(cur->right)
        {
            path.push_back(cur->right->val);
            count-=cur->right->val;
            traversal(cur->right,count);
            count+=cur->right->val;
            path.pop_back();
        }
        return;
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        result.clear();
        path.clear();
        if (root == NULL) return result;
        path.push_back(root->val); // 把根节点放进路径
        traversal(root, targetSum - root->val);
        return result;
    }
};

114. 二叉树展开为链表

这不就是前序遍历

其实要做的就是按前序序列创建一个树,每个节点只有右子树

相关推荐
CodeRecycle3 小时前
Python 自动配置 pip 支持库(通过 Windows Bat 脚本)
算法
liliangcsdn4 小时前
特质偏度因子的计算示例和分析
算法
荆棘鸟智能4 小时前
无人机遥感图像实时拼接算法工程实践:从特征提取到全景融合的完整技术链路
算法·无人机
xxwxx__4 小时前
C++ STL set 与 map 全套详解:关联式容器、红黑树底层、代码坑点、刷题实战
数据结构·c++
6Hzlia5 小时前
【Classic 150 刷题计划】 LeetCode 58. 最后一个单词的长度 | C++ 极简反向遍历与单变量状态机
算法
AgentMaster5 小时前
企业如何应用智能客服?5 个典型场景的技术架构与实施路径
大数据·算法
程曦曦5 小时前
MySQL 生产库误删 98 张表后的时间点恢复实战:从 binlog 解析到资金对账
linux·数据结构·其他·算法·ubuntu·运维开发
郝学胜-神的一滴5 小时前
Effective Python 条款 13:善用星号解包,告别下标切片拆分的坑
服务器·开发语言·数据结构·python·程序人生·pycharm
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出流水线上的“独特零件编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
weixin_307779136 小时前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab