二叉树交换相关算法题|递归/非递归交换所有节点左右子树(C)

交换左右子树

设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有节点的左右子树进行交换的函数

算法思想

采用递归算法实现交换二叉树的左右子树,首先交换root节点左孩子的左右子树,然后交换root节点右孩子的左右子树,最后交换root节点的左右孩子,当节点为空时递归结束(后序遍历思想)

void swap(BTNode root)
{if (root){swap(root->left);swap(root->right);temp = root->left;root->left = root->right;root->left = temp;}
}

非递归交换左右子树

算法思想
  • 初始化栈:将根节点入栈。
  • 遍历节点:
    • 弹出栈顶节点。
    • 交换该节点的左右子树。
    • 将右子树(若存在)入栈。
    • 将左子树(若存在)入栈。
  • 结束条件:栈为空,遍历结束。
  • 结果:树的所有节点的左右子树被交换。
// 定义二叉树节点 
typedef struct BTNode 
{ int data; struct BTNode* left; struct BTNode* right; 
} BTNode;// 交换左右子树 
void SwapChildren(BTNode* node) 
{ BTNode* temp = node->left; node->left = node->right; node->right = temp; 
}// 辅助函数:创建新节点 
BTNode* CreateNode(int data) 
{ BTNode* newNode = (BTNode*)malloc(sizeof(BTNode)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; 
} // 辅助函数:中序遍历 
void InOrderTraversal(BTNode* root) 
{ if (root == NULL) return; InOrderTraversal(root->left); printf("%d ", root->data); InOrderTraversal(root->right); 
}// 非递归交换二叉树所有节点的左右子树 
void SwapBinaryTree(BTNode* root) 
{ if (root == NULL) return; StackNode* stack = NULL; Push(&stack, root); while (!IsEmpty(stack)) { BTNode* current = Pop(&stack); // 交换当前节点的左右子树 SwapChildren(current); // 如果右子树存在,入栈 if (current->right) { Push(&stack, current->right); } // 如果左子树存在,入栈 if (current->left) { Push(&stack, current->left); } } 
}

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

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

相关文章

Playwright中Page类的方法

导航和页面操作 goto(url: str, **kwargs: Any): 导航到一个URL。 reload(**kwargs: Any): 重新加载当前页面。 go_back(**kwargs: Any): 导航到会话历史记录中的前一个页面。 go_forward(**kwargs: Any): 导航到会话历史记录中的下一个页面。 set_default_navigation_tim…

asp.net老项目运维,出现的问题6之数据库

数据库会有很多张表,表内一般会有自增列,如果想统一管理这个自增数值,可以使用如下方法,放在一个存储过程中,想用的时候调用存储过程即可生成数据库层面的全局唯一值: create procedure [dbo].[P_getSeqID…

酒店/电影推荐系统里面如何应用深度学习如CNN?

【1】酒店推荐系统里面如何应用CNN?具体过程是什么 在酒店推荐系统中应用卷积神经网络(CNN)并不是一个常见的选择,因为 CNN 主要用于处理具有空间结构的数据,如图像、音频和某些类型的序列数据。然而,在某…

链式设计模式

链式设计模式——装饰器模式和职责链模式 装饰模式 定义: 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。 结构 装饰(Decorator)模式中的角色: 抽…

Flink学习连载文章13--FlinkSQL高级部分

eventTime 测试数据如下: {"username":"zs","price":20,"event_time":"2023-07-17 10:10:10"} {"username":"zs","price":15,"event_time":"2023-07-17 10:10:3…

16、PyTorch中进行卷积残差模块算子融合

文章目录 1. 1x1卷积核-> 3x3卷积核2. 输入x --> 3x3卷积核,无变化3. 代码 1. 1x1卷积核-> 3x3卷积核 假设我们有一个1x1的卷积核,需要通过填充变为一个3x3的卷积核,实现的是像素之间无关联 [ 4 ] → [ 0 0 0 0 4 0 0 0 0 ] \begin{equation}…

深入理解代理模式(Proxy):静态代理、动态代理与AOP

目录 1. 代理模式简介2. 静态代理3. 动态代理 3.1 JDK动态代理3.2 CGLIB动态代理 4. 面向切面编程(AOP)5. 实战示例6. 总结与最佳实践 1. 代理模式简介 代理模式是一种结构型设计模式,它允许我们提供一个代理来控制对其他对象的访问。代理模式在不改变原始类代码…

java+springboot+mysql私人会所管理系统

项目介绍: 使用javaspringbootmysql开发的私人会所管理系统,系统包含管理员、技师、用户角色,功能如下: 管理员:用户管理;服务项目;技师管理;房间管理;预约管理&#x…

Formality:set_svf命令

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 svf文件的全称是Setup Verification for Formality,即Design Compiler提供给Formality的设置验证文件,它的作用是为Formality的指导模式(Gui…

Hive 数据操作语言全面解析

Hive 数据操作语言全面解析 在 Hive 大数据处理框架中,数据操作语言(DML)提供了多种方式来操作和修改数据,包括数据的加载、插入、更新、删除以及合并等操作。本文将详细介绍 Hive 中各类数据操作语句的语法、用法、注意事项以及…

JS API日期对象

目标:掌握日期对象,可以让网页显示日期 日期对象:用来表示时间的对象 作用:可以得到当前系统时间 实例化 目标:能够实现实例化日期对象 在代码中发现了new关键字时,一般将这个操作称为实例化 创建一个时…

【前端】JavaScript中的闭包与垃圾回收机制详解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯垃圾回收机制(Garbage Collection, GC)垃圾回收的核心原理核心过程 函数作用域与垃圾回收运行分析输出结果 垃圾回收的局限性与挑战 &#x1f4a…

单臂路由配置

知识点 单臂路由指在路由器上的一个接口配置子接口(逻辑接口)来实现不同vlan间通信 路由器上的每个物理接口都可以配置多个子接口(逻辑接口) 公司的财务部、技术部和业务部有多台计算机,它们使用一台二层交换机进行互…

verilog编程规范

verilog编程规范 文章目录 verilog编程规范前言一、代码划分二、verilog编码ABCDEFG 前言 高内聚,低耦合,干净清爽的代码 一、代码划分 高内聚: 一个功能一个模块干净的接口提取公共的代码 低耦合: 模块之间低耦合尽量用少量…

WEB安全基础知识

WAF全称为Web Application Firewall(网页应用防火墙)是一种专门设计用来保护web应用免受各种网络攻击的安全防护措施。它位于客户端与服务器之间,监控和过滤HTTP流量,从而拦截恶意请求、识别并防御常见的web攻击。 WAF的主要功能…

qemu安装arm64架构银河麒麟

qemu虚拟化软件,可以在一个平台上模拟另一个硬件平台,可以支持多种处理器架构。 一、安装 安装教程:https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接:https://qemu.weilnetz.de/w64/2024/ 我下载的是 …

前端怎么用 EventSource?EventSource 怎么配置请求头及加参数?EventSourcePolyfill 使用方法

前言 在前端开发中,特别是实时数据更新的场景下,EventSource 是一个非常实用的 API。它允许浏览器与服务器建立单向连接,服务器可以持续地发送数据给客户端,而无需客户端不断轮询。本文将详细介绍 EventSource 的使用方法、如何配…

188-下翻便携式6U CPCI工控机箱

一、板卡概述 下翻式CPCI便携工控机,系统采用6u cpci背板结构,1个系统槽,7个扩展槽, 满足对携带的需求,可装标准6U8槽CPCI主板,8个扩展槽, 满足客户对空间扩展的需求.可宽温服务的工作产品,15高亮度液晶显示屏,超薄88键笔记本键盘,触摸式鼠标,加固型机箱结构,使它能够适应各种复…

网页核心页面设计(第9章)

一、多个边框阴影 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-…

SpringBoot中Selenium详解

文章目录 SpringBoot中Selenium详解一、引言二、集成Selenium1、环境准备1.1、添加依赖 2、编写测试代码2.1、测试主类2.2、页面对象2.3、搜索组件 三、使用示例四、总结 SpringBoot中Selenium详解 一、引言 在现代软件开发中&#xff0c;自动化测试是提高软件质量、减少重复…