【数据结构】二叉树的遍历递归算法详解

二叉树的遍历

  • 💫二叉树的结点结构定义
  • 💫创建一个二叉树结点
  • 💫在主函数中手动创建一颗二叉树
  • 💫二叉树的前序遍历
  • 💫调用栈递归——实现前序遍历
  • 💫递归实现中序和后序遍历

💫二叉树的结点结构定义

typedef struct BinaryTreeNode
{int val;struct BinaryNode* left;struct BinaryNode* right;
}BTNode;

💫创建一个二叉树结点

我们来写一个函数BuyNode(x)函数用于创建二叉树结点。
用动态开辟函数malloc函数进行动态开辟,并强制转换为BTNode型,用变量node来去管理开辟的空间。
我们初始化结点,其val即为传入的参数x,左右指针leftright都设为NULL。

//创建一个二叉树结点
BTNode* BuyNode(int x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){perror("malloc fail");}else{node->val = x;node->left = NULL;node->right = NULL;}
}

💫在主函数中手动创建一颗二叉树


我们在主函数中创建上面这样一颗二叉树。
首先,我们需要开辟6个结点,但此时6个结点之间没有任何的联系,我们需要改变其中一些结点的指针域left和right,来使得结点之间产生联系。

int main()
{BTNode* node1 = BuyNode(1);BTNode* node2 = BuyNode(2);BTNode* node3 = BuyNode(3);BTNode* node4 = BuyNode(4);BTNode* node5 = BuyNode(5);BTNode* node6 = BuyNode(6);node1->left = node2;node1->right = node4;node1->right=node3;node2->left = node4;node3->left = node5;node3->right = node6;return 0;
}

💫二叉树的前序遍历

首先,我们先要了解以下二叉树前序的前序遍历。
二叉树的前序遍历:
根-->左子树-->右子树
对于我们上面的这颗二叉树:

1-->左-->

左子树和右子树也采用前序遍历的方式:

左子树:

2-->4

右子树

3-->5-->6

所以这颗二叉树的前序遍历为:

1-->2-->4-->3-->5-->6

正是由于这样的思想,将一个树根-->左-->右仍然是一颗树,接着再拆分…直到左子树和右子树的左右结点为空时。
所以这样的思想,我们就利用递归的想法就可以完成一颗二叉树的遍历。

💫调用栈递归——实现前序遍历

调用栈:程序在执行时,如果程序调用一个函数,它会先把这个函数压入栈中,等到这个函数返回结果(return )后,它才会从栈中弹出。
递归程序在执行时,会不断地调用自身,把函数压入栈中,当最后一个函数,也就是基线条件出现时,再逐渐清空栈空间。

下面我们根据这段代码来画图理解一些递归的思想。

//递归前序遍历一棵树
void PreOrder(BTNode* root)
{if (root == NULL){printf("NULL");return;}printf("%d", root->val);PreOrder(root->left);PreOrder(root->right);return 0;
}


我们按照步骤来执行以下程序:
主函数中进行了函数调用,参数为node1
压栈:

node1不为空,打印结点:

执行PreOrder(root->left),再次调用函数,参数为node2
进行压栈:

node2不为空,打印

执行PreOrder(root->left),再次调用函数,参数为node4,压栈:

node4不为空,打印:

执行PreOrder(root->left),再次调用函数,参数为NULL,压栈:

这是函数参数为NULL,进入if语句,进行打印 ,并return返回,这时出栈



y由于这段代码,当函数的参数为node4时,PreOrder(node4->left)已经有return,所以这时,程序会接着往下面执行PreOrder(node4->right)
这时再次调用函数,函数参数为NULL,压栈,打印,再出栈。


这时对于函数PreOrder (node4)已经执行完语句 PreOrder(node4->left)和语句PreOrder(node4->right)了,后执行 return 0,函数有返回结果,所以出栈


此时,我们该执行 node2的右结点了。
对于PreOrder(node2->right)中,函数函数即是NULL,所以先压栈,然后打印,然后出栈。



⑧此时,函数PreOrder(node2)PreOrder(node2->left)PreOrder(node2->right) 都已经执行完了,即已经对node2结点的左右子树遍历完成,执行return 0 返回,这时PreOrder(node2) 出栈。


在此时,我们已经对node1的左子树遍历完成,接下来同遍历左子树一样,我们对右子树进行遍历。




这时输出为:

💫递归实现中序和后序遍历

根据上面前序的递归,我觉得最重要的代码是:

	if (root == NULL){printf("NULL");return;}

它是递归中能否回溯的一个关键。
下面写中序遍历

//递归中序遍历二叉树
void Order(BTNode* root)
{if (root == NULL){printf("NULL ");return;}Order(root->left);printf("%d ", root->val);Order(root->right);return 0;
}

递归后序遍历一棵树:

//递归后序遍历一颗二叉树
void PostOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);return 0;
}

前中后序遍历结果分别为:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百面深度学习-循环神经网络

循环神经网络 什么是循环神经网络? 循环神经网络(Recurrent Neural Network,RNN)是一类用于处理序列数据的神经网络。你可以将它想象成一个机器,它不仅考虑当前的输入,还考虑之前接收过的输入。这使得它非…

本地生活餐饮视频怎么拍摄能有更多流量?如何批量生产呢?

本地生活近几年特别的火,所以到现在各类内容雷同性也比较高,视频缺少新的创意和玩法,像餐饮店的视频,大部分都是拍顾客进门、拍餐饮店座无虚席的实景……作为用户,其实早就已经看腻了。 今天推荐本地生活餐饮店商家拍…

b 树和 b+树的理解

(本文引自mic老师面试文档) 数据结构与算法问题,困扰了无数的小伙伴。 很多小伙伴对数据结构与算法的认知有一个误区,认为工作中没有用到,为什么面试要问,问了能解决实际问题? 图灵奖获得者&am…

手把手教你:LLama2原始权重转HF模型

LLama2是meta最新开源的语言大模型,训练数据集2万亿token,上下文长度由llama的2048扩展到4096,可以理解和生成更长的文本,包括7B、13B和70B三个模型,在各种基准集的测试上表现突出,该模型可用于研究和商业用…

Android sqlite 使用简介

进行Android应用开发时经常会用到数据库。Android系统支持sqlite数据库,在app开发过程中很容易通过SQLiteOpenHelper使用数据库,SQLiteOpenHelper依赖于Context对象,但是基于uiatomator1.0和Java程序等无法获取Context的应用如何使用数据库呢…

MongoDB副本集特点验证

MongoDB副本集特点验证 mogodb副本集概述副本集搭建副本集结构验证结果源码地址 mogodb副本集概述 MongoDB副本集是将数据同步在多个服务器的过程。 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证…

【MongoDB】索引 - 复合索引

一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, class: { id: 1, name: "1班" }},{ _id: 2, name: "李四", age: 22, class: { id: 2, name: "2班" }},{ _id: 3, name: "王五…

经验模态分解(Empirical Mode Decomposition,EMD)(附代码)

代码原理 EMD(Empirical Mode Decomposition),也称为经验模态分解,是一种将非线性和非平稳信号分解成多个本征模态函数(Intrinsic Mode Functions,简称IMF)的方法。 EMD的基本原理是通过一系列…

【Mysql】增删改查(基础版)

我使用的工具是Data Grip (SQLyog Naivact 都行) 使用Data Grip创建student表,具体步骤如下(熟悉Data Grip或者使用SQLyog,Naivact可以跳过) https://blog.csdn.net/m0_67930426/article/details/13429…

zookeeper:服务器有几种状态?

四种: looking(选举中)、leading(leader)、following( follower)、 observer(观察者角色)

字节流操作

for i in range(100):ai.to_bytes(2,byteorderbig)print(i,a,end )if i%40:print() 字节流 a5678 先把5678转换为二进制就变成 0001_0110_0010_1110拆分两个字节,高字节在前,低字节在后 hig_byte 0001_0110 对应的16进制 0x16 little_byte 0010_11…

掌动智能:UI自动化测试工具产品功能和优势

UI自动化测试工具是一种软件工具,用于模拟用户与应用程序的交互,检查应用程序的用户界面是否按预期工作。这些工具允许开发人员编写测试脚本,以模拟用户操作,例如点击按钮、输入文本、导航菜单等,然后验证应用程序的响…

在linux上脱离hadoop安装hbase-2.5.6集群

一、软件版本 1.1、jdk1.8 1.2、hbase 2.5.6 1.3、zookeeper 3.8.1 二、计算节点 准备三台服务器 192.168.42.139 node1 192.168.42.140 node2 192.168.42.141 node3三、配置环境 1、每台服务器都配置jdk环境变量 [rootnode1 data]# javac -version javac 1.8.0_3912、每…

lvgl 转换和使用新字体

一、背景 如果lvgl 提供的默认字体不符合我们的显示要求,我们可以在网上下载开源字体,或者利用系统自带(注意版权问题)的字体文件转换lvgl 能识别和调用的字体。 或者为了压缩存储空间,某些字体我们只需要个别字符&…

SpringBoot测试类启动web环境-下篇

一、响应状态 1.MockMvcResultMatchers 说明:模拟结果匹配。 package com.forever;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoC…

TCP网络编程

一)TCP Socket介绍: 1)TCP和UDP有着很大的不同,TCP想要进行网络通信的话首先需要通信双方建立连接以后然后才可以进行通信,TCP进行网络编程的方式和文件中的读写字节流类似,是以字节为单位的流进行传输 2)针对于TCP的套接字来说,J…

LangChain之关于RetrievalQA input_variables 的定义与使用

最近在使用LangChain来做一个LLMs和KBs结合的小Demo玩玩,也就是RAG(Retrieval Augmented Generation)。 这部分的内容其实在LangChain的官网已经给出了流程图。 我这里就直接偷懒了,准备对Webui的项目进行复刻练习,那么…

【QEMU-tap-windows-Xshell】QEMU 创建 aarch64虚拟机(附有QEMU免费资源)

“从零开始:在Windows上创建aarch64(ARM64)虚拟机” 前言 aarch64(ARM64)架构是一种现代的、基于 ARM 技术的计算架构,具有诸多优点,如低功耗、高性能和广泛应用等。为了在 Windows 平台上体验…

(欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明

文章目录 系统说明openEuler23.03系统手动配置ip流程修改名称生成网卡配置文件【openEuler23.03系统添加网卡文件配置流程】手动指定ip添加ipv6地址修改配置文件信息和名称删除创建的网卡信息重启网卡生效并测试 openEuler23.03系统网络管理说明 系统说明 我这用云上最小化安装…

【Python大数据笔记_day05_Hive基础操作】

一.SQL,Hive和MapReduce的关系 用户在hive上编写sql语句,hive把sql语句转化为MapReduce程序去执行 二.Hive架构映射流程 用户接口: 包括CLI、JDBC/ODBC、WebGUI,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端…