基础算法集训第18天:深度优先搜索

目录

排列序数

十位数宝藏代码

带分数

[LCR 175. 计算二叉树的深度 - 力扣(LeetCode)](#LCR 175. 计算二叉树的深度 - 力扣(LeetCode))

[104. 二叉树的最大深度 - 力扣(LeetCode)](#104. 二叉树的最大深度 - 力扣(LeetCode))

[226. 翻转二叉树 - 力扣(LeetCode)](#226. 翻转二叉树 - 力扣(LeetCode))

[938. 二叉搜索树的范围和 - 力扣(LeetCode)](#938. 二叉搜索树的范围和 - 力扣(LeetCode))

[LCP 44. 开幕式焰火 - 力扣(LeetCode)](#LCP 44. 开幕式焰火 - 力扣(LeetCode))

[100. 相同的树 - 力扣(LeetCode)](#100. 相同的树 - 力扣(LeetCode))


排列序数

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
string s;
int res;
int n;
int dis[11];
int a[11];
bool vis[11];
void dfs(int x)
{
    if (x == n)
    {
        for (int i = 0; i < n; i++)
        {
            if (a[i] < dis[i])
            {
                res++;
                return;
            }
            else if (a[i] > dis[i])
            {
                return;
            }
        }
        cout << res;
        exit(0);
    }
    for (int i = 0; i < n; i++)
    {
        if (!vis[i])
        {
            vis[i] = true;
            a[x] = i;
            dfs(x + 1);
            a[x] = 0;
            vis[i] = false;
        }
    }
}
int main()
{
    cin >> s;
    n = s.size();
    for (int i = 0; i < n; i++)
    {
        dis[i] = s[i] - 'a';
    }
    dfs(0);
    return 0;
}

十位数宝藏代码

cpp 复制代码
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
int a[11];
bool vis[11];
int res1 = 0;
int res2 = 1e12;
int n = 10;
void dfs(int x)
{
    if (x == n)
    {
        if (a[0] == 0)
        {
            return;
        }
        int sum = 0;
        for (int i = 0; i < n; i++)
        {
            sum *= 10;
            sum += a[i];
        }
        if (sum % 11 == 0)
        {
            res1 = max(res1, sum);
            res2 = min(res2, sum);
        }
        return;
    }
    for (int i = 0; i < n; i++)
    {
        if (!vis[i])
        {
            vis[i] = true;
            a[x] = i;
            dfs(x + 1);
            a[x] = 0;
            vis[i] = false;
        }
    }
}
signed main()
{
    dfs(0);
    cout << res1 - res2;
    return 0;
}

带分数

cpp 复制代码
#include <iostream>
using namespace std;
int a[10];
bool vis[10];
int res;
int n = 9;
int num;
void dfs(int x)
{
    if (x == n)
    {
        for (int i = 0; i < 7; i++)
        {
            for (int j = i + 1; j < 8; j++)
            {
                int A = 0;
                int B = 0;
                int C = 0;
                for (int k = 0; k <= i; k++)
                {
                    A = A * 10 + a[k];
                }
                if (A >= num)
                {
                    continue;
                }
                for (int k = i + 1; k <= j; k++)
                {
                    B = B * 10 + a[k];
                }
                for (int k = j + 1; k < 9; k++)
                {
                    C = C * 10 + a[k];
                }
                if (B % C == 0)
                {
                    if (A + B / C == num)
                    {
                        res++;
                    }
                }
            }
        }
        return;
    }
    for (int i = 1; i <= 9; i++)
    {
        if (!vis[i])
        {
            vis[i] = true;
            a[x] = i;
            dfs(x + 1);
            a[x] = 0;
            vis[i] = false;
        }
    }
}
int main()
{
    cin >> num;
    dfs(0);
    cout << res;
    return 0;
}

LCR 175. 计算二叉树的深度 - 力扣(LeetCode)

cpp 复制代码
/**
 * 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 calculateDepth(TreeNode* root) {
        if(root==0)return 0;
        int left=calculateDepth(root->left);
        int right=calculateDepth(root->right);
        return max(left,right)+1;
    }
};

104. 二叉树的最大深度 - 力扣(LeetCode)

cpp 复制代码
/**
 * 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) {
        if(root==0)return 0;
        int left=maxDepth(root->left);
        int right=maxDepth(root->right);
        return max(left,right)+1;
    }
};

226. 翻转二叉树 - 力扣(LeetCode)

cpp 复制代码
/**
 * 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:
    TreeNode* invertTree(TreeNode* root) {
        if(root){
            swap(root->left,root->right);
            invertTree(root->left);
            invertTree(root->right);
        }
        return root;
    }
};

938. 二叉搜索树的范围和 - 力扣(LeetCode)

cpp 复制代码
/**
 * 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 rangeSumBST(TreeNode* root, int low, int high) {
        if(root==0)return 0;
        int res=0;
        if(root->val>=low&&root->val<=high)res+=root->val;
        res+=rangeSumBST(root->left,low,high);
        res+=rangeSumBST(root->right,low,high);
        return res;
    }
};

LCP 44. 开幕式焰火 - 力扣(LeetCode)

cpp 复制代码
/**
 * 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 {
    unordered_map<int, int> map;
public:
    int numColor(TreeNode* root) {
        if (root == 0)return 0;
        map[root->val]++;
        numColor(root->left);
        numColor(root->right);
        return map.size();
    }
};

100. 相同的树 - 力扣(LeetCode)

cpp 复制代码
/**
 * 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:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(p==nullptr&&q==nullptr){
            return true;
        }
        else if(p==nullptr||q==nullptr){
            return false;
        }
        if(p->val!=q->val){
            return false;
        }
        return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
    }
};

知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具

相关推荐
小O的算法实验室2 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生2 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿2 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz2 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能2 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****2 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能2 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能2 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo2 天前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ02 天前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法