二叉树-遍历-单独精讲

news2024/11/16 23:51:14

文章目录

  • 遍历
  • 中序遍历/节点的中序
  • 前序遍历-节点的前序
  • 后序遍历-节点的后序
  • 三序综合
    • 13-Apush前/前序前
    • 13-Bpush前/中序前
    • 13-Cpush前/后序前
  • 两序重叠
    • 示例一
      • 13前序前
      • 13中序前
    • 示例二
      • 13前序前
      • 13后序前
    • 示例三
      • 13中序前
      • 13后序前

遍历

遍历

  • 即:遍历每个元素。
    for遍历只会遍历每个元素一次。
    二叉树遍历每个元素则会依次遍历三次。
    分别叫
    第一次,前序,即通过父节点进入此节点
    第二次,中序,即通过左节点进入此节点
    第三次,后序,即通过右节点进入此节点
    而通过左右节点进入则代表左右子树都遍历完。

中序遍历/节点的中序

void traveres(TreeNode* root){

        if(!root)
            return;

        traveres(root->left);

        cout << root->val << endl;

        traveres(root->right);
    }

中序遍历亦叫节点的中序。即节点在中序的时候做cout。而遍历也就是每个节点都在中序的时候做cout。
所以traveres(root->left);指节点的左树都做中序,即左树的中序。所以,cout会在节点的左树中序后执行。
所以,中序遍历的时机就是遍历完左树后。
所以,节点的中序 = 左树的中序 + 节点。
节点的全部中序 = 节点左树中序 + 节点 + 节点右树中序。
但在节点中序前(cout前)也是有其内容的,那么这些内容是什么。
这些内容就是节点与根节点路径上的节点中序。但并非每个节点都有中序。而是要具体判断。
如13中序前(cout前),
13左树中序(无13(因为指的是cout前)),6+6左树的中序,无3,1+1左树的中序。
判断方式:
是否遍历完节点左树。即节点中序。而左树的结果也就是左树中序。
在这里插入图片描述

前序遍历-节点的前序

void traveres(TreeNode* root){

        if(!root)
            return;
        
        cout << root->val << endl;

        traveres(root->left);
        traveres(root->right);
    }

节点在前序比较简单,即指在第一次进节点时做cout。
同理,traveres(root->left);则指左树的前序。
当然,节点前序前也并非什么都没有,而是有其与根节点的路径上的节点。但此时路径上的节点则必有。
如14,有7的前序,有3的前序,有1的前序。
在这里插入图片描述

后序遍历-节点的后序

void traveres(TreeNode* root){

        if(!root)
            return;
        
        traveres(root->left);
        traveres(root->right);

        cout << root->val << endl;
    }

后序遍历指节点在后序时做cout。所以,每个节点都在后序时做cout。
即,traveres(root->left);指左树的后序。
所以,后序遍历的具体时间点就是在左树和右树的后序后。
即,节点的后序 = 左树的后序 + 右树的后序 + 根节点。
当然,节点的后序前也并非什么都没有。但此时路径上的节点则必没有。
如15,则有14的后序,有6的后序,有2的后序。
在这里插入图片描述

三序综合

    vector<int> A;
    vector<int> B;
    vector<int> C;

    void traveres(TreeNode* root){

        if(!root)
            return;
            
        A.push_back(root->val);
        
        traveres(root->left);
        
        B.push_back(root->val);
        
        traveres(root->right);

        C.push_back(root->val);
    }

任意一个节点
如13

13-Apush前/前序前

此时
前序结果:
6+6左树的前序,3,1+1左树的前序。路径节点必有。
中序结果:
6+6左树的中序,无3,1+1左树的中序。具体判断。
后序结果:
12的后序,2的后序。路径的节点必无。
在这里插入图片描述

13-Bpush前/中序前

此时
前序结果:
13+13左树的前序,6+6左树的前序,3,1+1左树的前序。路径节点必有。
中序结果:
13左树的中序,6+6左树的中序,无3,1+1左树的中序。具体判断。
后序结果:
13左树的后序,12的后序,2的后序。路径的节点必无。
在这里插入图片描述

13-Cpush前/后序前

此时
前序结果:
整个13的前序,6+6左树的前序,3,1+1左树的前序。路径节点必有。
中序结果:
整个13的中序,6+6左树的中序,无3,1+1左树的中序。具体判断。
后序结果:
13左树的后序+13右树的后序,12的后序,2的后序。路径的节点必无。

两序重叠

示例一

void traveres(TreeNode* root){

        if(!root)
            return;
        
        A.push_back(root->val);
        
        traveres(root->left);
        
        A.pop_back(root->val);
        
        traveres(root->right);
    }

节点会在中序的时候清空A
那么traveres(root->left);也就是节点左树在中序的时候清空A

13前序前

在这里插入图片描述
依旧看节点与跟节点的路径。
此时
6遍历完左树。
3没有遍历完左树。
1遍历完左树。
则6清空,有3,1清空。
故A仅剩3。

13中序前

在这里插入图片描述
此时,遍历完节点左树,清空。
接着看节点与跟节点的路径。
此时,依旧
6清空,有3,1清空。
故A有3,13。

示例二

    vector<int> A;
    void traveres(TreeNode* root){

        if(!root)
            return;
        
        A.push_back(root->val);
        
        traveres(root->left);
        traveres(root->right);

        A.pop_back(root->val);
    }

节点在后序的时候清空A
那么traveres(root->left);也就是左树在后序的时候清空A。
同理,右树也在后序的时候清空A。

13前序前

在这里插入图片描述
此时,节点与跟节点的路径
6:6的左树遍历完,故左树清空。但右树没有遍历完,故有6。
3:3的左树没有遍历完。故有3。
1:1的左树遍历完,右树没有遍历完,故有1。
故A有1,3,6。

13后序前

在这里插入图片描述
此时,节点与跟节点的路径
13:13的左树与右树遍历完。
6:6的左树遍历完。
3:3的左树没有遍历完。
1:1的左树遍历完。
故A有1,3,6,13。

示例三

    vector<int> A;
    
    void traveres(TreeNode* root){

        if(!root)
            return;
        
        traveres(root->left);

        A.push_back(root->val);
        
        traveres(root->right);

        A.pop_back(root->val);
    }

节点在中序的时候入A,在后序的时候清空A。
那么traveres(root->left);左树在中序的时候入A,后序的时候清空A。
同理,右树也在中序的时候入A,后序的时候清空A。

13中序前

在这里插入图片描述
此时,节点与跟节点的路径
13:遍历完左树。还没push。
6:遍历完左树。故有6
3:正在遍历左树。故无3
1:遍历完左树。故有1
故A有1,6。

13后序前

在这里插入图片描述
此时,节点与跟节点的路径
13:13的左树与右树遍历完。还没pop。
6:6的左树遍历完。右树没有。
3:3的左树没有遍历完。
1:1的左树遍历完。右树没有
故A有1,6,13。
let allRoot = TreeNode.create([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,31]);

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

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

相关文章

Kafka配置Kerberos安全认证及与Java程序集成

Background 本文主要介绍在 Kafka 中如何配置 Kerberos 认证&#xff0c;以及 java 使用 JAAS 来进行 Kerberos 认证连接。本文演示为单机版。 所用软件版本 查看 Kerberos 版本命令&#xff1a;klist -V 软件名称版本jdk1.8.0_202kafka2.12-2.2.1kerberos1.15.1 1、Kerberos …

RT-Thread:STM32 PHY 调试,使用软件包 WIZNET 驱动 W5500

说明&#xff1a; 1. 本文记录使用 RT-Thread 软件包 WIZNET驱动 W5500 的调试笔记。 2. 采用 RT-Thread Studio 工程 STM32F407VET6 芯片&#xff0c;W5500 PHY芯片&#xff0c;两者之间使用SPI接口链接 。 注意&#xff1a; 1.在按流程建立工程&#xff0c;和移植完 wizn…

ASP.NET摄影展示网站源码

ASP.NET摄影展示网站源码 项目描述 网站利用了ext技术&#xff0c;用户自定义了展示控件 前台展示类别有&#xff1a; 协会动态&#xff0c;摄影理论&#xff0c;影展影赛&#xff0c;采风路线&#xff0c; 影友之窗&#xff0c;佳作欣赏&#xff0c;器材专区&#xff0c;展览信…

「达摩院MindOpt」优化FlowShop流水线作业排班问题

FlowShop流水线作业 在企业在面临大量多样化的生产任务时&#xff0c;如何合理地安排流水线作业以提高生产效率及确保交货期成为了一个重要的问题。 一个典型的问题就是FlowShop流水线作业安排问题,也有称为生产下料问题。它涉及到多台机器、多个工序以及多个作业的调度安排。…

QWebEngineView类方法、属性、信号与槽汇总

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📝 使用示例📝 方法📝 属性📝 信号(Signals)📝 槽(Slots)⚓️ 相关链接 ⚓️📖 介绍 📖 QWebEngineView 是 Qt 提供的一个用于呈现 Web 内容的类,基于 Google 的 Chromium 浏览器引擎。它提供了对现…

在线直线度测量仪确保了出厂圆棒无不合格品

在线直线度测量仪确保了出厂圆棒无不合格品 随着生产设备的改进&#xff0c;利用基础材料进行生产的厂家对品质要求也越来越高&#xff0c;其中圆形棒管材的直线度尺寸&#xff0c;也是广受关注&#xff0c;对其进行矫直检测&#xff0c;使其出厂无不合格品。 变抽检为全检 以前…

C 语言每日一题——旋转数组的最小数字

一、题目内容 提供一下该OJ题的链接&#xff1a;旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com) 二、题目分析 通过示例1可知&#xff0c;我们写代码的目的是在数组中找到一个最大值&#xff0c;并且返回来&#xff1b; 我们很容易的会想到创建一个变量&#xff1a;int…

企业培训系统源码:构建智能、可扩展的学习平台

企业培训系统在现代企业中扮演着至关重要的角色。本文将通过深度解析企业培训系统的源码&#xff0c;介绍如何构建一个智能、可扩展的学习平台&#xff0c;涉及关键技术和代码实例。 1. 技术栈选择与项目初始化 在构建企业培训系统之前&#xff0c;选择适当的技术栈是至关重…

先锋WEB燃气收费系统 Upload.aspx 文件上传漏洞复现

0x01 产品简介 先锋WEB燃气收费系统是一种先进的在线燃气收费解决方案,旨在简化和优化燃气收费的流程和管理。该系统基于Web平台,提供了一系列功能和工具,使燃气公司能够高效地进行收费、账单管理和客户服务。 0x02 漏洞概述 先锋WEB燃气收费系统/AjaxService/Upload.asp…

Windows压缩包的MySQL安装方式

1.下载压缩包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.35-winx64.zip 2.解压压缩包&#xff08;建议将解压到非C盘&#xff0c;路径不要出现特殊符号&#xff09; 3.在MySQL主目录下&#xff0c;创建my.ini空文件&#xff08;先创建一个txt文件&#xff0c;进…

软件测试|selenium 元素无法选择异常的原因及解决

简介 在进行 Web 自动化测试时&#xff0c;使用 Selenium 可能会遇到各种异常情况。其中之一就是 ElementNotSelectableException 异常&#xff0c;该异常通常意味着在尝试选择一个不可选元素时出现了问题。本文将详细介绍这个异常的原因、可能的解决方法&#xff0c;并提供示…

微信小程序开发学习笔记《10》页面导航

微信小程序开发学习笔记《10》页面导航 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。导航 官方文档 一、介绍 1. 什么是页面导航 页面导航指的是页面之间的相互跳转。例如&#xff0c;浏览器中实现页面导航的方式有如下两种: …

<蓝桥杯软件赛>零基础备赛20周--第14周--BFS

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

C++I/O流——(2)预定义格式的输入/输出(第一节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

snmp协议配置

引言 SNMP&#xff08;Simple Network Management Protocol&#xff09;是一种网络管理协议&#xff0c;用于管理和监控网络设备、操作系统和应用程序。它提供了一组用于检索和修改网络设备配置、监视设备状态和性能的标准化方法。 SNMP 是一个客户端-服务器协议&#xff0c;…

【Docker】数据管理之数据卷的挂载

一、什么是数据卷 为了很好的实现数据保存和数据共享&#xff0c;Docker提出了Volume这个概念&#xff0c;简单的说就是绕过默认的联合 文件系统&#xff0c;而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。数据卷提供了一些有用的特性&#xff1a; 数据卷可以在…

java自定义排序Comparator

&#x1f4d1;前言 本文主要是【java】——java自定义排序Comparator的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每…

《C++ Primer》第14章 重载运算与类型转换(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 14.1 基本概念&#xff08;P490&#xff09; 重载的运算符是具有特殊名字的函数&#xff0c;其名字有 operator 和要定义的运算符组合而成。和其他函数一样&#xff0c;重载运算符也具有返回类型、参数列表…

人工智能推动供应链革命的成功

人工智能推动供应链革命的成功 目录 人工智能推动供应链革命的成功一、供应链管理不断变化的面貌二、拥挤的解决方案景观三、踏上人工智能驱动的转型1. 价值创造识别、战略和路线图2. 目标解决方案设计和供应商选择3. 实施与系统集成4. 变革管理、能力建设和全面价值获取 新技术…

深思这届CES,前沿新物种「辣眼睛」背后

作者 | 陈然 来源 | 洞见新研社 每届CES都会让不少人发出“无趣”的感叹。的确&#xff0c;无论是置身会场还是看网络上的报道&#xff0c;到处都是熙熙攘攘的人群&#xff0c;很难从中发现哪些产品或创意值得把玩一番。 实际上&#xff0c;辣眼睛的新物种常有&#xff0c;制…