首页 > 编程语言 >C++U5-09-二叉树2

C++U5-09-二叉树2

时间:2023-12-11 14:34:33浏览次数:46  
标签:遍历 U5 09 dfs int 二叉树 元素 节点

二叉树(二)

二叉树遍历是一种重要的操作,它在许多应用场景中被广泛使用。以下是一些常见的应用场景:

查找和搜索:二叉树遍历可以用于查找特定元素或者进行搜索操作。通过遍历整棵树,可以找到目标元素并进行相应的处理。例如,在二叉搜索树中查找某个特定值,或者在字典树中搜索以某个前缀开头的单词。

排序和输出:二叉树的中序遍历可以按照升序输出树中的节点值,从而实现对树中元素的排序功能。这在需要对树中元素进行排序或者输出有序结果的情况下非常有用。

表达式求值:二叉树遍历可以用于对表达式进行求值。通过构建表达式树,并对其进行先序、中序或后序遍历,可以按照特定的顺序计算表达式的值。

图遍历:二叉树可以看作一种特殊的图结构,因此二叉树遍历也可以用于图的遍历。例如,通过深度优先搜索(DFS)或广度优先搜索(BFS)遍历二叉树,可以访问所有的节点,实现对图的遍历和搜索。

解析和编译:在计算机科学中,二叉树遍历常用于语法分析和编译过程中。通过构建语法树或抽象语法树,并进行遍历操作,可以对代码进行解析、优化和生成相应的目标代码。

路径查找和最优解决方案:通过遍历二叉树,可以寻找特定路径或者最优解决方案。例如,在二叉树中查找从根节点到叶子节点的路径,或者在二叉堆中找到具有最小或最大值的元素。

这些只是二叉树遍历的一些常见应用场景,实际上,二叉树遍历在各种数据结构和算法中都发挥着重要的作用,包括图算法、搜索算法、动态规划等。

 

 先序遍历

 先序遍历动态图

 

练习:

 

中序遍历

 中序遍历动态图

 

选择练习

 后序遍历

  后序遍历动态图

 

练习

 前中后序遍历代码实现

 前序遍历

 

【算法分析】
前序遍历:

输出当前结点的值
递归去处理左子树
递归去处理右子树
【参考代码】
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 9;
int a[maxn]; // 存放元素的数组
int n; // 元素数量

// 深度优先搜索函数
void dfs(int x) {
    cout << a[x] << " "; // 输出当前节点的值
    if (2 * x <= n) dfs(2 * x); // 如果存在左子节点,则递归调用dfs函数
    if (2 * x + 1 <= n) dfs(2 * x + 1); // 如果存在右子节点,则递归调用dfs函数
}

int main() {
    cin >> n; // 输入元素数量
    for (int i = 1; i <= n; i++) cin >> a[i]; // 输入每个元素的值
    dfs(1); // 从根节点开始进行深度优先搜索
    return 0;
}

执行流程:

定义了常量maxn表示最大的数组大小。
声明了一个整型数组a,用于存放元素。数组大小为maxn。
声明了一个整型变量n,用于记录输入的元素数量。
定义了一个深度优先搜索函数dfs,用于遍历二叉树。该函数接受一个整数参数x,表示当前节点的索引。
在dfs函数中,首先输出当前节点的值a[x]。
然后判断当前节点是否有左子节点(即2*x <= n),如果有,则递归调用dfs函数,传入左子节点的索引(即2*x)。
接着判断当前节点是否有右子节点(即2*x + 1 <= n),如果有,则递归调用dfs函数,传入右子节点的索引(即2*x + 1)。
在main函数中,首先输入元素数量n。
使用循环从1到n依次输入每个元素的值,存放在数组a中。
调用dfs(1),从根节点开始进行深度优先搜索。
遍历完成后,程序结束。
View Code

中序遍历

 

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 9;
int a[maxn]; // 存放元素的数组
int n; // 元素数量

// 深度优先搜索函数
void dfs(int x) {
    if (2 * x <= n) dfs(2 * x); // 如果存在左子节点,则递归调用dfs函数
    cout << a[x] << " "; // 输出当前节点的值
    if (2 * x + 1 <= n) dfs(2 * x + 1); // 如果存在右子节点,则递归调用dfs函数
}

int main() {
    cin >> n; // 输入元素数量
    for (int i = 1; i <= n; i++) cin >> a[i]; // 输入每个元素的值
    dfs(1); // 从根节点开始进行深度优先搜索
    return 0;
}

执行流程:

定义了常量 maxn 表示最大的数组大小。
声明了一个整型数组 a,用于存放元素。数组大小为 maxn。
声明了一个整型变量 n,用于记录输入的元素数量。
定义了一个深度优先搜索函数 dfs,用于遍历二叉树。该函数接受一个整数参数 x,表示当前节点的索引。
在 dfs 函数中,首先判断当前节点是否有左子节点(即 2*x <= n),如果有,则递归调用 dfs 函数,传入左子节点的索引(即 2*x)。
接着输出当前节点的值 a[x]。
然后再判断当前节点是否有右子节点(即 2*x + 1 <= n),如果有,则递归调用 dfs 函数,传入右子节点的索引(即 2*x + 1)。
在 main 函数中,首先输入元素数量 n。
使用循环从 1 到 n 依次输入每个元素的值,存放在数组 a 中。
调用 dfs(1),从根节点开始进行深度优先搜索。
当执行到 dfs(x) 时,会先递归访问左子节点 dfs(2*x),然后输出当前节点 a[x] 的值,最后递归访问右子节点 dfs(2*x+1)。
遍历完成后,程序结束。
View Code

 

后序遍历

 

【算法分析】
后序遍历:

递归去处理左子树
递归去处理右子树
输出当前结点的值
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 9;
int a[maxn]; // 存放元素的数组
int n; // 元素数量

// 深度优先搜索函数
void dfs(int x) {
    if (2 * x <= n) dfs(2 * x); // 如果存在左子节点,则递归调用dfs函数
    if (2 * x + 1 <= n) dfs(2 * x + 1); // 如果存在右子节点,则递归调用dfs函数
    cout << a[x] << " "; // 输出当前节点的值
}

int main() {
    cin >> n; // 输入元素数量
    for (int i = 1; i <= n; i++) cin >> a[i]; // 输入每个元素的值
    dfs(1); // 从根节点开始进行深度优先搜索
    return 0;
}

执行流程:

定义了常量 maxn 表示最大的数组大小。
声明了一个整型数组 a,用于存放元素。数组大小为 maxn。
声明了一个整型变量 n,用于记录输入的元素数量。
定义了一个深度优先搜索函数 dfs,用于遍历二叉树。该函数接受一个整数参数 x,表示当前节点的索引。
在 dfs 函数中,首先判断当前节点是否有左子节点(即 2*x <= n),如果有,则递归调用 dfs 函数,传入左子节点的索引(即 2*x)。
接着判断当前节点是否有右子节点(即 2*x + 1 <= n),如果有,则递归调用 dfs 函数,传入右子节点的索引(即 2*x + 1)。
最后输出当前节点的值 a[x]。
在 main 函数中,首先输入元素数量 n。
使用循环从 1 到 n 依次输入每个元素的值,存放在数组 a 中。
调用 dfs(1),从根节点开始进行深度优先搜索。
当执行到 dfs(x) 时,会先递归访问左子节点 dfs(2*x),然后递归访问右子节点 dfs(2*x+1),最后输出当前节点 a[x] 的值。
遍历完成后,程序结束。

 

 

层次遍历

 

 

 本节课作业讲解分析:

链接:https://pan.baidu.com/s/1gRFdJLPZAgvIPpD7P74D2A?pwd=zll9
提取码:zll9

 

标签:遍历,U5,09,dfs,int,二叉树,元素,节点
From: https://www.cnblogs.com/jayxuan/p/17894324.html

相关文章

  • 2023-2024-1 20232309 《网络空间安全导论》第14(5)周学习总结
    2023-2024-120232309《网络空间安全导论》第14(5)周学习总结教材学习内容总结教材学习中的问题和解决过程1.什么是Spam?。。。。好好好2.爬虫相关原理?emmmmm果然现在看懂怎么操作的具体过程对我来说还是太困难了。。。3.怎样算非结构化信息?基于AI的学习(汗流浃背了......
  • 【2023-12-09】连岳摘抄
    23:59即便是以享乐为人生目标的伊壁鸠鲁,也相信人们要先有美德,才能享有生活的乐趣。                                                 ——乔纳森·海特人都有两颗心,......
  • 2023-2024-1 20231309 《计算机基础与程序设计》第十一周学习总结
    2023-2024-120231309《计算机基础与程序设计》第十一周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十一周作业这个作业的目标作业正文2023-2024-120231309《计算机基础......
  • 111. 二叉树的最小深度
    目录题目完美踩坑题解题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输出:5完美踩坑之前好几个题做过求树的高......
  • 使用双卡/8卡3090微调llama2-70B/13B模型
    写在前面本篇博文将会教大家如何在消费级的设备(或者各种超级便宜的洋垃圾上)实现13B/70B等无法在单张消费级显卡上加载(但可以在一台机器上的多张卡上加载)的模型的微调。由于绝大部分做实验,仅要求实现推理,或者在微调时没有资源上到全量/13B+级别的真·大模型的微调,没有涉及到将一......
  • Codeforces Round 909 (Div. 3)
    https://codeforces.com/contest/1899  一个小游戏#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;intn;intmain(){cin>>n;while(n--){intx;......
  • [HNOI2009] 梦幻布丁
    [HNOI2009]梦幻布丁题目描述$n$个布丁摆成一行,进行$m$次操作。每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色。例如,颜色分别为$1,2,2,1$的四个布丁一共有$3$段颜色.输入格式第一行是两个整数,分别表示布丁个数$n$和操作次数$m$。 第......
  • 2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小
    2023-12-09:用go语言,给你两个整数数组arr1和arr2,返回使arr1严格递增所需要的最小「操作」数(可能为0)。每一步「操作」中,你可以分别从arr1和arr2中各选出一个索引,分别为i和j,0<=i<arr1.length和0<=j<arr2.length,然后进行赋值运算arr1[i]=arr2[j]。如果......
  • 数据结构--二叉树的生成和遍历(9)
    好久没有更新博客了,关于二叉树也查了不少资料,下面写上我对二叉树的理解。一、什么是二叉树二叉树是一种树形结构,其中每个节点的叶子节点不超过两个,而且二叉树的左右子树是有顺序的,顺序不能颠倒如下图所示,一下四种都属于二叉树。  二、特殊的二叉树1.满二叉树:听名......
  • 【JavaSE】数据结构(树:二叉查找树、平衡二叉树、AVL树、红黑树)
    树度:每个节点的子节点数量树高:树的总层数根节点:入度为0的节点二叉树每个节点最多有两个子节点二叉查找树任意节点左子树上的节点都小于当前节点,右子树上的节点都大于当前节点平衡二叉树任意节点的左右子树的高度差不超过1AVL树AVL树是一种平衡二叉树,得名于其发明者的......