遍历二叉树和线索二叉树

news2024/11/29 12:50:41

目录

一、*遍历二叉树

1.1遍历定义

1.2遍历目的

1.3遍历用途

1.4遍历方法

1.4.1先序遍历(DLR)

1.4.2中序遍历(LDR)

1.4.3后序遍历(LRD)

1.5根据遍历序列确定二叉树

1.6遍历算法的实现

1.6.1先序遍历算法的实现

1.6.2中序遍历算法的实现

1.6.3后序遍历算法的实现

1.6.4中序遍历的非递归算法

1.6.5二叉树的层次遍历

1.7二叉树遍历算法的应用

1.7.1按先序遍历建立二叉树的二叉链表

1.7.2复制二叉树

 1.7.3计算二叉树深度

1.7.4计算二叉树结点总数

1.7.5计算二叉树叶子数

二、线索二叉树

2.1线索

2.2线索二叉树的存储结构


一、*遍历二叉树

1.1遍历定义

顺着某一条搜索路径巡防二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次(周游)

1.2遍历目的

得到树中所有结点的一个线性排列

1.3遍历用途

是树结构插入、删除、修改、查找和排序运算的前提

1.4遍历方法

依次遍历二叉树中的根结点、左子树和右子树,共有6种方案:

DLR、DRL、LDRLRD、RDL、RLD

若规定先左后右,则DLR(先序遍历)、LDR(中序遍历)、LRD(后序遍历)

1.4.1先序遍历(DLR)

 

1.4.2中序遍历(LDR)

1.4.3后序遍历(LRD)

 

练习 ①

 练习②

1.5根据遍历序列确定二叉树

由二叉树的先序序列和中序序列、后序序列和中序序列可以确定唯一一棵二叉树

①先序和中序例:

 ②后序和中序例:

1.6遍历算法的实现

1.6.1先序遍历算法的实现
Status PreOrderTraverse(BiTree T){
  if(T==NULL) return OK;  //空二叉树
  else{
     visit(T);            //访问根结点
     PreOrderTraverse(T->lchild);  //递归遍历左子树
     PreOrderTraverse(T->rchild);  //递归遍历右子树
  }
}
     
1.6.2中序遍历算法的实现
Status InOrderTraverse(BiTree T){
  if(T==NULL) return OK;  //空二叉树
  else{
     InOrderTraverse(T->lchild); //递归遍历左子树
     visit(T);            //访问根结点
     InOrderTraverse(T->rchild); //递归遍历右子树
  }
}
1.6.3后序遍历算法的实现
Status PostOrderTraverse(BiTree T){
  if(T==NULL) return OK; //空二叉树
  else{
     PostOrserTraverse(T->lchild); //递归遍历左子树
     PostOrderTraversr(T->rchild); //递归遍历右子树
     visit(T); //访问根结点
  }
}

时间和空间复杂度均为O(n)

1.6.4中序遍历的非递归算法

(用栈来实现:后进先出)

基本思想:①建立一个栈;②根结点进栈,遍历左子树;③根结点出栈,输出根结点,遍历右子树

Status InOrderTraverse(BiTree T){
  BiTree p; InitStack(S); p=T;
  while(p ||!StackEmpty(S)){
    if(p) { Push(S,p); p=p->lchild;}
    else  { Pop(S,q);  printf("%c",q->data);
            p=q->rchild;}
    };//while
  return OK;
}
  
1.6.5二叉树的层次遍历

对于一棵二叉树,从根结点开始,按从上到下、从左到右的顺序访问每一个结点,每一个结点仅访问一次。

(用队列来实现)

基本思想:①将根结点进队;②队不空时循环:从队列中出列一个结点*p,访问它:若它有左孩子结点,将左孩子结点进队;若它有右孩子结点,将右孩子结点进队。

void LevelOrder(BTNode *b){
     BTNode *p;  SqQueue *qu;
     InitQueue(qu);   //初始化队列
     enQueue(qu,b);   //根结点指针进入队列
     while(!QueueEmpty(qu)) { //队不为空,循环
       deQueue(qu,p);         //出队结点p
       printf("%c",p->data);  //访问结点p
       if(p->lchild!=NULL) enQueue(qu,p->lchild);  //有左孩子时将其进队
       if(p->rchild!=NULL) enQueue(qu,p->rchild);  //有右孩子时将其进队
     }
}
    

1.7二叉树遍历算法的应用

1.7.1按先序遍历建立二叉树的二叉链表

 

1.7.2复制二叉树

 

 1.7.3计算二叉树深度

 

1.7.4计算二叉树结点总数

1.7.5计算二叉树叶子数

二、线索二叉树

2.1线索

改变指向的指针:若某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱;若某结点的右孩子为空,则将空的右孩子指针域改为指向其后继

2.2线索二叉树的存储结构

 Ltag=0 ——>lchild域指示结点的左孩子

 Ltag=1 ——>lchild域指示结点的前驱

 Rtag=0 ——>rchild域指示结点的右孩子

 Rtag=1 ——>rchild域指示结点的后继

 

 

增设头结点

 

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

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

相关文章

MySQL—索引—基础语法

目录 一、创建、查看以及删除索引的语法 (1)创建索引 1、1会用到一个关键字:CREATE。 1、2增加索引还可以用到另外一个关键字——ALTER TABLE 表名 ADD INDEX ... 。 2、解释。 (2)查看索引 1、查看索引需要用到…

PCL 三次样条插值(二维点)

一、简介 在插值计算中,最简单的分段多项式近似应该是分段线性插值,它由连接一组数据点组成,仅仅只需要将这些点一一用直线进行顺序相连即可。不过线性函数插值的缺点也很明显,就是在两个子区间变化的比较突兀,也就是没有可微性(不够光滑)。因此我们需要更为符合物理情况…

Day58 代码随想录打卡|二叉树篇---将有序数组转换为二叉搜索树

题目(leecode T108): 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 方法:用有序数组构造平衡二叉搜索树,和我们之前有一题的思路差不多&#xff0c…

计算机毕设JAVA——学习考试管理系统(基于SpringBoot+Vue前后端分离的项目)

学习考试管理系统 概要系统架构技术运行环境系统功能项目演示图片 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观,而且功能结构十分单一,存在很多雷同的项目:页面基本上就是套用固定模板,换个颜色、改个文字&#…

如何使用gprof对程序进行性能分析

如何使用gprof对程序进行性能分析 目录 1 gprof概述 2 gprof原理简述 3 gprof使用 3.1 gprof使用简述 3.2 gprof使用示例 4 小结 1 gprof概述 gprof 是 一个 GNU 的程序性能分析工具,可以用于分析C\C程序的执行性能。gprof工具可以统计出各个函数的调用次数、执…

C语言小例程

题目&#xff1a;两个乒乓球队进行比赛&#xff0c;各出三人。甲队为a,b,c三人&#xff0c;乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比&#xff0c;c说他不和x,z比&#xff0c;请编程序找出三队赛手的名单。 #include <stdio.h> #in…

【职场人】职场进化记:我的“不惹人厌邀功精”之路

刚步入职场的我&#xff0c;就像一张白纸&#xff0c;什么都不懂&#xff0c;只知道埋头苦干。但渐渐地&#xff0c;我发现那些经常“冒泡”的同事似乎总能得到更多的关注和机会。我不禁想&#xff1a;“我是否也要成为那样一个‘邀功精’呢&#xff1f;” 不过&#xff0c;我…

BFS:解决最短路问题

文章目录 什么是最短路问题&#xff1f;1.迷宫中离入口最近的出口2.最小基因变化3.单词接龙4.为高尔夫比赛砍树总结 什么是最短路问题&#xff1f; 最短路问题是图论中的经典问题&#xff0c;旨在寻找图中两个节点之间的最短路径。常见的最短路算法有多种&#xff0c;这次我们…

MSPM0G3507——GPIO例程讲解1——input_capture

函数&#xff1a; 参数&#xff1a; 返回值&#xff1a; 主函数代码&#xff1a; #include "ti_msp_dl_config.h"extern volatile uint32_t interruptVectors[];int main(void) {SYSCFG_DL_init(); //把所有的LED灯和按键初始化了一…

idea导入文件里面的子模块maven未识别处理解决办法

1、File → Project Structure → 点击“Modules” → 点击“” → “Import Model” 2、可以看到很多子模块&#xff0c;选择子模块下的 pom.xml 文件导入一个一个点累死了&#xff0c;父目录下也没有pom文件 解决办法&#xff1a;找到子模块中有一个pom.xml文件&#xff0c;…

【CT】LeetCode手撕—42. 接雨水

目录 题目1- 思路2- 实现⭐42. 接雨水——题解思路 3- ACM实现 题目 原题连接&#xff1a;42. 接雨水 1- 思路 模式识别&#xff1a;求雨水的面积 ——> 不仅是只求一个比当前元素大的元素&#xff0c;还要求面积 单调栈 应用场景&#xff0c;需要找到左边比当前元素大的…

钓鱼隐藏--文件后缀压缩文件捆绑文件

免责声明:本文仅做技术交流与学习... 目录 文件后缀-钓鱼伪装-RLO 压缩文件-自解压-释放执行 捆绑文件-打包加载-释放执行 文件后缀-钓鱼伪装-RLO 改后缀--伪装 w.exe wgpj.exe (要改的后缀反写)(jpg--->gpj) | (光标移到要改的后缀的前边)(w和g中间) …

Sequelize入门及简单的增删改查

前言 学习一下NodeJS怎么使用Sequelize怎么查询数据库数据 一、Sequelize是什么&#xff1f; Sequelize 是一个基于 promise 的 Node.js ORM, 二、搭建项目 1.安装过程 npm i -g sequelize-cli //全局安装sequelize-clinpm i sequelize mysql2 //安装sequelize和mysql2…

基于YOLOv5的交通标志检测的设计与实现

简介 在智能交通系统中,交通标志的准确检测与识别对提高道路安全和交通效率至关重要。为了实现这一目标,我们开发了一种基于YOLOv5目标检测模型的交通标志检测系统。本报告将详细介绍该系统的实际应用与实现,包括系统架构、功能实现、使用说明、检测示例、数据集获取与介绍…

通信系统网络架构_1.局域网网络架构

当今&#xff0c;通信网络从大的方面主要包括局域网、广域网、移动通信网等网络形式。不同的网络会采用不同的技术进行网络构建。以下针对不同的网络给出各自的网络架构以及所采用的技术。 1.概述 局域网&#xff0c;即计算机局部区域网络&#xff0c;是一种为单一机构所拥有的…

运维.云技术学习.基于应用服务网格的灰度发布(上:理论基础篇)

运维专题 基于应用服务网格的灰度发布&#xff08;上&#xff1a;理论基础篇&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAdd…

CVPR‘24 最佳学生论文,从灵感到成稿仅用一个月,源自业余创意!

北京时间6月20日凌晨&#xff0c;CVPR 2024正式公布了最佳论文和最佳学生论文等奖项。 其中&#xff0c;最佳论文有两篇&#xff0c;分别是BioCLIP和Mip-Splatting。 据Mip-Splatting论文的第一作者Zehao Yu的导师、图宾根大学教授Andreas Geiger透露&#xff0c;这篇论文从想法…

CompletableFuture 基本用法

一、 CompletableFuture简介 CompletableFuture 是 Java 8 引入的一个功能强大的类&#xff0c;用于异步编程和并发处理。它提供了丰富的 API 来处理异步任务的结果&#xff0c;支持函数式编程风格&#xff0c;并允许通过链式调用组合多个异步操作。 二、CompletableFuture中…

Rocky Linux archive下载地址

Index of /vault/rocky/https://dl.rockylinux.org/vault/rocky/

【人工智能】—XGBoost算法在构建互联网防火墙异常行为识别模型应用案例

摘要&#xff1a; 近年来&#xff0c;各地党委、政府加快推进新型工业化&#xff0c;部署实施制造强市战略&#xff0c;提出工业企业“智改数转”是推动全市工业经济稳增长的重要引擎&#xff0c;更是稳增长、促发展的重要抓手。今天博主就以互联网防火墙异常行为识别为例给大家…