【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历

简介: 【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历

一、二叉树的直径

点我直达~

思路:二叉树的深度优先搜索

根据题目要求,求二叉树的直径,就是求二叉树的任意一个节点左右子树的最大深度,左右子树的最大深度的就是所求的路径。

看下图理解:

对于节点2来说,其左子树的最大深度为2,说明一定有一条大小为2的路径直通左子树的叶子节点,其右子树的最大深度为2,说明一定有一条大小为2的路径直通右子树的叶子节点,这样从以节点2为根节点的树的任意一个叶子节点一定有一条大小为4的路径到达另一个叶子节点。

所以我们需要做的就是找到任意一个节点的左右子树的最大深度。

  • 按照深度优先搜索的算法,我们首先持续遍历左子节点。如果节点为空,返回0
  • 将左右子树都遍历后,比较左右子树的高度,再返回大的高度+1就是当前节点的高度。
  • 注意:在这个过程,我们需要用一个全局变量max来更新每一次遍历某一个节点之后他的最长路径,也就是该节点的左右子树的高度之和。

具体代码如下:

class Solution {
public:
    int MAX; //记录每一次遍历一个节点的左右子树后的最长路径
    int depth(TreeNode* root)
    {
        if(root == nullptr)
            return 0;
        int l = depth(root->left);//递归左子树的最大深度
        int r = depth(root->right);//递归右子树的最大深度
        if(l+r > MAX)
            MAX = l+r;
        // 求出左右子树最大深度+1,就是到自己的深度
        return max(l,r) +1 ;
    }
    int diameterOfBinaryTree(TreeNode* root) 
    {
        MAX = 0;
        depth(root);
        return MAX ;
    }
};

时间复杂度O(n),空间复杂度O(n):最坏情况下为链式结构;最好情况下为平衡二叉树:O(logN);

二、二叉树的层序遍历

点我直达~

思路:借助队列实现

  • 二叉树的层序遍历,实际上就是广度优先搜索,从根往下从左到右逐一遍历每一层的节点。
  • 所以我们需要借助一个队列q1,如果该根节点不为空,将该节点入队
  • 然后计算队列中的元素数量,即为这一层的节点个数
  • 先取出该队列的队头元素,然后将该节点的val值存入到顺序表v1中,如果该节点的左右子节点均不为空,则带动该节点的左右子节点入队,然后再将该节点出队,最后重新计算该队列的元素大小。
  • 注意:每遍历完一层,就需要将v1加入到专门存储顺序表的顺序表v之中。
  • 不断重复上述过程,直到该树遍历完为止。

具体代码如下:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
        vector<vector<int>> v;
        queue <TreeNode*> q1;
        //入队
        if(!root)
            return v;
        q1.push(root);
        while(!q1.empty())
        {
            //存进顺序表前先计算当前队列有多少个元素。
            int size = q1.size();
            vector <int> v1;
            //存入顺序表
            while(size--)
            {
                TreeNode* root = q1.front();
                v1.push_back(root->val);
                if(root->left)
                    q1.push(root->left);
                if(root->right)
                    q1.push(root->right);
                q1.pop();
            }
            //然后将v1存入v中并刷新
            v.push_back(v1);
        }
        return v;
    }
};

时间复杂度O(n),遍历完每一个节点;空间复杂度O(n),当二叉树退化到链式结构时,深度为n,系统维护的辅助栈就为n的大小;最好情况为平衡二叉树时,高度logN,空间复杂度O(logN)

总结:

通过写这道二叉树的直径,越发觉得递归是一个比较神奇且难以理解的东西,还有这个最长路径,我是看了不下5次的答案才看懂最长路径为什么等于一个节点的左右子树的深度和。

二叉树的层序遍历,需要借助队列实现,这个还是比较简单的,相对于官方标记层序遍历是中等题,个人更认为二叉树的直径这道题是中等题。

目录
打赏
0
0
0
0
20
分享
相关文章
|
4月前
|
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
101 9
 算法系列之数据结构-二叉树
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
205 2
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
113 5
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
180 5
基于遗传优化ELM网络的时间序列预测算法matlab仿真
本项目实现了一种基于遗传算法优化的极限学习机(GA-ELM)网络时间序列预测方法。通过对比传统ELM与GA-ELM,验证了参数优化对非线性时间序列预测精度的提升效果。核心程序利用MATLAB 2022A完成,采用遗传算法全局搜索最优权重与偏置,结合ELM快速训练特性,显著提高模型稳定性与准确性。实验结果展示了GA-ELM在复杂数据中的优越表现,误差明显降低。此方法适用于金融、气象等领域的时间序列预测任务。
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。
基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
本内容展示了基于GA(遗传算法)优化的256QAM概率星座整形(PCS)技术的研究与实现。通过Matlab仿真,分析了优化前后星座图和误码率(BER)的变化。256QAM采用非均匀概率分布(Maxwell-Boltzman分布)降低外圈星座点出现频率,减小平均功率并增加最小欧氏距离,从而提升传输性能。GA算法以BER为适应度函数,搜索最优整形参数v,显著降低误码率。核心程序实现了GA优化过程,包括种群初始化、选择、交叉、变异等步骤,并绘制了优化曲线。此研究有助于提高频谱效率和传输灵活性,适用于不同信道环境。
41 10
|
22天前
|
基于遗传优化算法的带时间窗多车辆路线规划matlab仿真
本程序基于遗传优化算法,实现带时间窗的多车辆路线规划,并通过MATLAB2022A仿真展示结果。输入节点坐标与时间窗信息后,算法输出最优路径规划方案。示例结果包含4条路线,覆盖所有节点并满足时间窗约束。核心代码包括初始化、适应度计算、交叉变异及局部搜索等环节,确保解的质量与可行性。遗传算法通过模拟自然进化过程,逐步优化种群个体,有效解决复杂约束条件下的路径规划问题。
基于遗传算法的64QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
本内容主要探讨基于遗传算法(GA)优化的64QAM概率星座整形(PCS)技术。通过改变星座点出现的概率分布,使外圈点频率降低,从而减小平均功率、增加最小欧氏距离,提升传输性能。仿真使用Matlab2022a完成,展示了优化前后星座图与误码率对比,验证了整形增益及频谱效率提升效果。理论分析表明,Maxwell-Boltzman分布为最优概率分布,核心程序通过GA搜索最佳整形因子v,以蒙特卡罗方法估计误码率,最终实现低误码率优化目标。
29 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问