【每日挠头算法题(6)】二叉树的所有路径|神奇字符串

简介: 【每日挠头算法题(6)】二叉树的所有路径|神奇字符串

一、二叉树的所有路径

点我直达~

思路:深度优先搜索

  • 使用深度优先搜索:即二叉树的前序遍历。
  • 1.给一个string类型的顺序表:vector<string> path,记录每一条可以遍历的路径,如果该节点不为空,给一个临时的存储路径的string,叫node,将该节点的val存入node中
  • 2.如果该节点的左子节点和右子节点均为空,说明此节点数一条路径的最后节点,此时将临时的存储路径node存储到path中。
  • 3.如果该节点既不为空,且左右节点不全为空,说明该条路径还未走完,则继续遍历即可。

具体代码如下:

class Solution {
public:
    void PrevOrder(TreeNode* root,string node, vector<string>& path)
    {
        //只要该节点不为空,则可继续走
        if(root!=nullptr)
        {
            node+=to_string(root->val);
            //只要左右节点都为空,表明获得一条路径
            if(root->left == nullptr && root->right == nullptr)
            {
                path.push_back(node);
            }
            //如果不是以上的情况,则可以继续递归
            else
            {
                node+="->";
                PrevOrder(root->left,node,path);
                PrevOrder(root->right,node,path);
            }
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) 
    {
        string node = "";
        vector<string> path;
        PrevOrder(root,node,path);
        return path;
    }
};

具体递归展开图如下:

时间复杂度:O(n^2),因为每次对node进行拷贝构造,所有时间消耗O(n),那么总的时间为O(n^2);最坏空间复杂度O(n),此时树呈现出链状,最好空间复杂度为O(logN),此时树为平衡二叉树

二、神奇字符串

点我直达~

思路:模拟双指针

  • 首先需要知道题目需要我们做什么。
  • 神奇字符串定义:只由’1’,'2’组成,且连续的’1’或者’2’出现的次数组合起来可以生成该字符串。
  • 所以我们的目的是构造出神奇字符串。
  • 1.构造一个string类,初始化为s = "122",这样初始化的原因:
  • (1)题目给的神奇字符串类就是如此。
  • (2)要构造神奇字符串需要从第3位开始构造。
  • 2.给定下标 i = 2记录需要构造的字符数字个数,隐式存在的下标j = s.size() - 1,记录需要构造的字符。构造长度为N
  • 也就是说,构造什么字符取决于j的下标对应的字符,如果s[j] = '1',则构造的字符为’2’,如果不是则反过来。构造的个数取决于s[i],如果s[i] = 2,s[j] = 1,则构造的数字为:“22”
  • 3.构造完成后,遍历s的前n个,统计’1’出现的次数即可。(注意:可能最后一次构造会构造2个字符,导致s的长度为n+1,而不是n,所以不能遍历s,只能遍历s的前n个字符)
  • 注:如果 n < 3,则无需再构造,返回1即可。

过程展示:

具体代码如下:

class Solution {
public:
    int magicalString(int n) 
    {
        string s = "122";
        int i = 2; // i表示要构造几位
        //要构造什么取决于最后一位,如果s的最后一位是'1',就构造'2',如果s的最后一位是'2',就构造'1'
        for(i = 2;i < n ; ++i)
        {
            int len = s[i] - '0';
            if(s[s.size()-1] == '2')
            {
                while(len--)
                    s+='1';
            }
            else
            {
                while(len--)
                    s+='2';
            }
        }
        //此时遍历n个数字,计算1出现次数,不是遍历s,因为最后一次构造啃s构造了两个数字,导致s的长度是n+1而不是n
        int count = 0;
        for(int i = 0;i<n;++i)
        {
            if(s[i] == '1')
                ++count;
        }
        return count;
    }
};

时间复杂度O(n),空间复杂度O(n),需要构造长度为n的字符串

总结

通过写二叉树,我深知我的递归没有学得扎实,打击心态呀,所以从明天开始着手刷二叉树的题,练练递归。

写这个神奇字符串,还是读不懂题目的,看了答案大佬们的题解才恍然大悟。需要多加强练习。

相关文章
|
26天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
29天前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
49 5
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
32 0
|
2月前
|
数据采集 监控 安全
厂区地图导航制作:GIS技术与路径导航算法融合
在智能化、数字化时代,GIS技术为厂区的运营管理带来了革命性变化。本文探讨了如何利用GIS技术,通过数据采集、地图绘制、路径规划、位置定位和信息查询等功能,打造高效、精准的智能厂区地图导航系统,提升企业的竞争力和管理水平。
66 0
厂区地图导航制作:GIS技术与路径导航算法融合
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
26 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
8天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
5天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
|
9天前
|
算法
基于大爆炸优化算法的PID控制器参数寻优matlab仿真
本研究基于大爆炸优化算法对PID控制器参数进行寻优,并通过Matlab仿真对比优化前后PID控制效果。使用MATLAB2022a实现核心程序,展示了算法迭代过程及最优PID参数的求解。大爆炸优化算法通过模拟宇宙大爆炸和大收缩过程,在搜索空间中迭代寻找全局最优解,特别适用于PID参数优化,提升控制系统性能。