算法日记 11 day 二叉树

news2024/11/29 0:54:18

新的篇章,二叉树!!!

二叉树的种类

        满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。

        完全二叉树:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。

        意思就是,对于完全二叉树来说,每一层都是填满的,如果有没有填满的一层,结点顺序也必须从左向右填充。就像这样。

        二叉搜索树:对于二叉搜索树,他是一种有序树。其中他的结点必须满足这些条件。

                                如果左子节点不为空,那么左子节点的值小于结点值。

                                如果右子节点不为空,那么右子节点的值大于节点值。

                                左右子树同样满足上面的条件。

简而言之,左节点值<结点值<右节点值。

        平衡二叉搜索树:又被称为AVL。它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

二叉树的遍历

        二叉树的遍历分为前中后三种遍历方式,三者的去边就在于结点和其左右子节点的遍历顺序不同。以根结点的遍历顺序命名。比如:

前序遍历,遍历顺序为中左右,先遍历根节点,在遍历左节点,最后右节点。

中序遍历,遍历顺序为左中右,先遍历左节点,在遍历根节点,最后右节点。

后序遍历,遍历顺序为左右中,先遍历左节点,在遍历右节点,最后中节点。

        递归遍历:

题目:二叉树的前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

题目分析 :     
public class Solution {
    public IList<int> PreorderTraversal(TreeNode root) {
        var res=new List<int>();
        if(root==null) return res;
        Traversal(root,res);
        return res;
    }
    public void Traversal(TreeNode root,List<int> res){
        if(root==null) return;
        res.Add(root.val); //当前节点,记录,相当于中
        Traversal(root.left,res);//将左节点传入,遍历,相当于左
        Traversal(root.right,res);//将右节点传入,遍历,相当于右
        //遍历顺序为中左右。
        //对于递归法的中序和后序,也只是改变这三行的顺序而已
        //res.Add(root.val); 
        //Traversal(root.left,res);
        //Traversal(root.right,res);
    }
}

他的运行情况大概是这样的

从根节点一路遍历到叶子节点,然后返回到上一级点,在去遍历上一节点的右边。重复这个过程,知道所有节点都被遍历完成。

        迭代遍历:

     同样的题目,来看看迭代法。

public class Solution {
    public IList<int> PreorderTraversal(TreeNode root) {
        var res=new List<int>();
        if(root==null) return res;
        Stack<TreeNode> temp=new Stack<TreeNode>();
        temp.Push(root);//放入初始节点
        while(temp.Count!=0)//保证所有节点都被放入过栈中   
        {
            TreeNode node=temp.Pop();//取出栈顶元素
            res.Add(node.val);
            if(node.right!=null)//前序为中左右,这里使用了栈,因为栈是先进后出的,所以先将右节点放入
                temp.Push(node.right);
            if(node.left!=null)
                temp.Push(node.left);
        }
        return res;   
    }
}

来看看他的执行过程吧。

https://code-thinking.cdn.bcebos.com/gifs/%E4%BA%8C%E5%8F%89%E6%A0%91%E5%89%8D%E5%BA%8F%E9%81%8D%E5%8E%86%EF%BC%88%E8%BF%AD%E4%BB%A3%E6%B3%95%EF%BC%89.gif

对于递归法来说,前序的中左右和后序的左右中其实写法也差不多。

可以看到,在递归是改变入栈的顺序的到的结果是不一样的,而将这个结果反转就成了另外一种遍历。但是对于中序不行。中序的左右中,如果用上面的代码是不行的。

public class Solution {
    public IList<int> InorderTraversal(TreeNode root) {
        var res=new List<int>();
       Stack<TreeNode> temp=new Stack<TreeNode>();//辅助栈
       TreeNode cur=root;//指向当前访问的节点

       while(temp.Count!=0||cur!=null)
       {
        if(cur!=null)
        {
            temp.Push(cur);
            cur=cur.left;//向左遍历,确定没有左孩子
        }
        else//没有左节点的节点
        {
            cur= temp.Pop();
            res.Add(cur.val);
            cur=cur.right;//指向右节点,开始迭代
        }
       }
        return res;
    }
}

来看看运行过程:

https://code-thinking.cdn.bcebos.com/gifs/%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%EF%BC%88%E8%BF%AD%E4%BB%A3%E6%B3%95%EF%BC%89.gif

那么,迭代法有没有一种写法能和递归一样,只需要改变顺序就可以改变遍历顺序的呢?

迭代法的统一写法:

// 中序遍历
public IList<int> InorderTraversal(TreeNode root)
{
    var res = new List<int>();
    var st = new Stack<TreeNode>();
    if (root == null) return res;
    st.Push(root);
    while (st.Count != 0)
    {
        var node = st.Peek();
        if (node == null)
        {
            st.Pop();
            node = st.Peek();
            st.Pop();
            res.Add(node.val);
        }
        else
        {
            st.Pop();
            if (node.right != null) st.Push(node.right);//右
            st.Push(node);//中
            st.Push(null);//中
            if (node.left != null) st.Push(node.left);//左
        }
    }
    return res;
}

来看看他的运行过程:

https://code-thinking.cdn.bcebos.com/gifs/%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%E8%BF%AD%E4%BB%A3%EF%BC%88%E7%BB%9F%E4%B8%80%E5%86%99%E6%B3%95%EF%BC%89.gif

层序遍历: 

        题目:二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode)

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
题目分析:

        看张图吧》

https://code-thinking.cdn.bcebos.com/gifs/102%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.gif

这就是层序遍历的运行过程。

public class Solution {
    public IList<IList<int>> LevelOrder(TreeNode root) {
        IList<IList<int>> res=new List<IList<int>>();
        Queue tmp = new Queue();//辅助队列
        if(root==null) return res;
        tmp.Enqueue(root);
        while(tmp.Count!=0)
        {
            int size=tmp.Count;//记录每一层的数量,方便出队时区分层数
            IList<int> vec=new List<int>();
            for(int i=0;i<size;i++)
            {
                TreeNode node=(TreeNode)tmp.Dequeue();
                vec.Add(node.val);//取出
                if(node.left!=null) tmp.Enqueue(node.left);//加入左节点
                if(node.right!=null) tmp.Enqueue(node.right);
            }
            res.Add(vec);
        }
        return res;
    }
}

 对于层序遍历的题,有很多的变体,其本质上都是层序。

对于更详细的解析与其他语言的代码块,可以去代码随想录上查看。

代码随想录 (programmercarl.com)

已刷题目:33

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2227403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA->EasyCode(mapper.xml) 字段无逗号分隔和修改全局变量问题

1.mapperxml字段无逗号分隔 在easycode的设置里找到&#xff1a; 1、Template下的 mapper.xml.vm脚本 2、Global Config下的 mybatisSupport.vm脚本 将脚本里的 $velocityHasNext 替换成 $foreach.hasNext&#xff0c;然后保存。Mybatis-Plus框架操作一样 github->issue连…

红队工具---Behinder学习

1.什么是Behinder&#xff1f; Behinder 是一款用于网络渗透测试的安全工具&#xff0c;主要用于对 Web 应用进行攻击和漏洞利用。它提供了强大的功能&#xff0c;是一款红队的大杀器&#xff0c;几乎是现代web安全必须学习的一款webshell管理工具。 主要用途 渗透测试&#…

中航资本:商业卫星产业链建设加快 无人机军民两用空间广阔

互联网医疗迎多重边沿改进 我国居民医疗保健开支稳步添加&#xff0c;据国家统计局数据&#xff0c;2023年全国居民医疗保健人均消费开支为2460元&#xff0c;占人均消费总开支的比例从2018年的8.5%前进至2023年的9.2%。跟着慢病患者群扩展、业态相似的外卖、产品电商翻开以及…

基于springboot+vue实现的免费体育馆场地预约系统 (源码+L文+ppt)4-099

基于springbootvue实现的免费体育馆场地预约系统 &#xff08;源码L文ppt&#xff09;4-099 4.1 系统总体结构设计 本系统是基于B/S架构的网站系统&#xff0c;分为系统前台和系统后台&#xff0c;前台主要是提供给注册用户和未注册登录的游客使用的&#xff0c;包括首页、场馆…

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年&#xff0c;求伯君用128万行代码编写出了WPS1.0&#xff0c;宣告了中国自主办公时代的开启。 那时候&#xff0c;雷军还在武汉大学深造&#xff0c;他早就把求伯君当成了自己的榜样&#xff0c;这一来二去的&#xff0c;雷军和WPS之间也就结下了不解之缘…

基于GFlowNets的蚁群抽样算法在组合优化中的应用(arXiv 2024)(未完) -1

文章目录 Abstract1 Introduction2 Related works2.1 蚁群优化2.2 神经组合优化2.3 GFlowNets与组合优化3 Preliminary3.1 旅行商问题3.2 蚁群优化3.3 生成流网络Abstract 本文介绍了一种神经引导的概率搜索算法——生成流蚁群采样器(GFACS),用于解决组合优化(CO)问题。G…

【C++】类和对象(四):析构函数

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的析构函数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. 概念2. 特性 1. 概念 通过前面构造函数的学习&#xff0c;我们知道一个对象是怎么来的…

VulkanTutorial(8·Shader modules)

Shader modules 与早期的API不同&#xff0c;Vulkan中的着色器代码必须以字节码格式指定&#xff0c;而不是人类可读的语法&#xff0c;如GLSL和HLSL。这种字节码格式称为SPIR-V它是一种可用于编写图形和计算着色器的格式 使用像SPIR-V这样简单的字节码格式&#xff0c;不会面…

详解PHP正则表达式中的转义操作

PHP正则表达式中的特殊字符和转义 在 PHP 正则表达式中&#xff0c;有许多特殊字符具有特定的意义。这些特殊字符通常用于定义匹配模式的一部分&#xff0c;或者改变匹配的行为。以下是 PHP 正则表达式中一些常用的特殊字符及其含义: .匹配除换行符之外的任何单个字符 ^在方括…

27.Redis哨兵架构

Redis哨兵高可用架构 Sentinel&#xff08;哨兵&#xff09;是一种特殊的 Redis 服务&#xff0c;其主要功能并非提供常规的读写服务&#xff0c;而是专门用于监控 Redis 实例节点。 1.在哨兵架构下&#xff0c;客户端&#xff08;client 端&#xff09;首次会从哨兵处找出 Re…

STM32G474硬件CRC7和软件CRC7校验

1、CRC7的多项式和初始值 #define CRC_Hardware_POLYNOMIAL_7B 0x09//硬件CRC多项式为0x09 //SD卡中的校验算法CRC7&#xff0c;生成多项式为x^7 x^3 1&#xff0c;由于bit7不存在&#xff0c;只有bit31和bit01&#xff0c;所以多项式为0x09#define CRC7_INIT_VALUE 0…

Java基础 —— IO流详解

IO流 在Java中&#xff0c;IO&#xff08;输入/输出&#xff09;流是用于在程序与外部世界&#xff08;如文件、网络、内存等&#xff09;之间传输数据的机制。IO流分为两大类&#xff1a;输入流&#xff08;InputStream/Reader&#xff09;和输出流&#xff08;OutputStream/…

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用&#xff1f;小结&#xff1a;同步调用优缺点 1-2 异步调用什么是异步调用&#xff1f;小结&#xff1a;异步调用的优缺点&#xff0c;什么时候使用异步调用&#xff1f; 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数

文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座&#xff0c;并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站&#xff0c;可见性分析确定地面站坐标分析单颗…

Excel菜单选项无法点击?两种原因及解决方法全解析

在使用Excel处理数据时&#xff0c;有时会遇到菜单选项无法点击的情况。这种问题会影响到正常的操作和编辑。出现这种情况的原因可能有多种&#xff0c;本文将介绍两种常见的原因&#xff0c;并提供相应的解决方法&#xff0c;帮助小伙伴们快速恢复菜单选项的正常使用。 原因一…

【银河麒麟高级服务器操作系统·实例分享】裸金属服务器开机失败分析及处理建议

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 裸金属物理服务器开机卡在EFI stub页面…

基于Spring Boot的在线摄影工作室开发指南

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理网上摄影工作室的相关信息成为必然。开发合…

UE5蓝图中整理节点的方法

UE5蓝图中整理节点的方法 第一种&#xff1a;子图 右键选中的节点&#xff0c;出现一个面板&#xff0c;点击 Collapse Nodes 既可折叠选中的所有节点 注意&#xff1a;子图不可以被复制使用。 双击子图可以查看节点&#xff0c;若不想折叠选中的节点为子图&#xff0c;右键点…

喜讯丨江苏省医药行业协会·中药饮片专业委员会2024年度三届五次会员代表大会暨《江苏中药饮片》通讯员年度表彰大会圆满举行

2024年10月25日&#xff0c;江苏省医药行业协会中药饮片专业委员会三届五次&#xff08;2024年度&#xff09;会员代表大会暨《江苏中药饮片》通讯员年度表彰大会在苏州香格里拉大酒店隆重召开。 江苏省药品监督管理局、药品生产监管局、江苏省医药行业协会、江苏省食品药品监督…

git push到远程怎么回退

git push到远程服务器想继续修改&#xff0c;你必须要回退然后在此提交。而且需要保留本地的修改文件。 下面给你一些git命令&#xff0c;回退很简单。 按照下面的流程操作就行&#xff1a; 1.查看提交历史 首先&#xff0c;使用git log命令查看提交历史。可以使用以下命令显…