【每日挠头算法题(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次的答案才看懂最长路径为什么等于一个节点的左右子树的深度和。

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

相关文章
|
1天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
33 5
|
1月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
60 5
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
47 0
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
32 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
103 80
|
21天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
27天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
7天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
14天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。