二叉树交换左右子树的三种实现方式

第4关:非递归实现二叉树左右子树交换 是指按照先左节点,再右节点,最后根节点的次序访问二叉树中所有的节点,使得每个节点被访问且仅被访问一次。本关任务:给定一棵二叉树,使用非递归的方式实现二叉树左右子树交换,并输出后序遍历结果。平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。为了完成本关任务,你需要掌握:1.栈的基本操作,2.二叉树后序遍历。本关的编程任务是补全右侧代码片段。 阅读详情
AI摘要

这篇博客介绍了如何在顺序存储结构和链式存储结构中交换二叉树的左右子树。分别给出了递归和非递归两种方法的详细代码实现,包括先序创建二叉树、先序遍历以及交换操作。通过示例代码展示了如何在C++中进行这些操作。

二叉树交换左右子树的三种实现方式

顺序存储结构

交换左右子树实际上就是同层之间交换位置,在顺序存储结构下,先确定树的深度,再划分层,每个层内做交换即可。

在这里插入图片描述

链式存储结构

递归实现很简单,非递归可以借助栈或队列辅助实现。

递归代码:

void ReChange(BiTree root)
{
    if(root==NULL) return;
    else
    {
        BiTree temp=root->lchild;
        root->lchild=root->rchild;
        root->rchild=temp;
        ReChange(root->lchild);
        ReChange(root->rchild);
    }
}

非递归代码:

void Change(BiTree root)
{
    BiTree Queue[MAXSIZE];
    int front=-1;
    int rear=0;
    Queue[rear]=root;
    while(rear!=front)
    {
        BiTree p=Queue[++front];
        BiTree temp=p->lchild;
        p->lchild=p->rchild;
        p->rchild=temp;
        if(p->lchild) Queue[++rear]=p->lchild;
        if(p->rchild) Queue[++rear]=p->rchild;
    }
}

完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;

typedef char DataType;

#define MAXSIZE 100

typedef struct node
{
    DataType data;
    struct node *lchild;
    struct node *rchild;
}BiTreeNode,*BiTree;

//先序建立二叉树
void CreateBiTree(BiTree &root)
{
    char c;
    cin>>c;
    if(c=='#')
    {
        root=NULL;
    }
    else
    {
        root=(BiTree)malloc(sizeof(BiTreeNode));
        root->data=c;
        CreateBiTree(root->lchild);
        CreateBiTree(root->rchild);
    }
}

//递归实现先序遍历
void PreOrder(BiTree root)
{
    if(root!=NULL)
    {
        cout<<root->data<<" ";
        PreOrder(root->lchild);
        PreOrder(root->rchild);
    }
}

//递归实现交换左右子树
void ReChange(BiTree root)
{
    if(root==NULL) return;
    else
    {
        BiTree temp=root->lchild;
        root->lchild=root->rchild;
        root->rchild=temp;
        ReChange(root->lchild);
        ReChange(root->rchild);
    }
}

//非递归实现交换左右子树
void Change(BiTree root)
{
    BiTree Queue[MAXSIZE];
    int front=-1;
    int rear=0;
    Queue[rear]=root;
    while(rear!=front)
    {
        BiTree p=Queue[++front];
        BiTree temp=p->lchild;
        p->lchild=p->rchild;
        p->rchild=temp;
        if(p->lchild) Queue[++rear]=p->lchild;
        if(p->rchild) Queue[++rear]=p->rchild;
    }
}

//测试序列:ABDG###E##CF#H###
int main()
{
    BiTree root;
    CreateBiTree(root);

    PreOrder(root);
    cout<<endl;

    ReChange(root);

    PreOrder(root);
    cout<<endl;

    Change(root);

    PreOrder(root);
    cout<<endl;

    system("pause");
    return 0;
}
交换二叉树中每个结点的左孩子和右孩子 在之前的博客中,我们已经掌握了二叉树先序遍历、中序遍历和后序遍历递归算法. 我们可以任选一种遍历序列作为本算法的基础,并在遍历结点时交换该结点的左右子树顺序即可. 在此,我选择先序遍历序列. 遍历序列的选择仅仅是"开胃菜",解决本问题的核心是"如何交换某结点的左右子树顺序":大家可以在草稿纸上画出一棵形态具有代表性(即不能过... 阅读详情

相关推荐

交换二叉树中所有节点的左右子树的位置_层次遍历法和递归法(二叉树)

算法特点及适用场景层次遍历法利用队列实现了按照层次顺序对二叉树节点的访问和交换,适用于需要对二叉树节点进行层次相关操作且希望避免递归带来的栈空间风险的场景,如在处理大规模二叉树结构时,对空间要求较为严格的情况下。递归法基于二叉树的递归结构,代码简洁直观,易于理解,适用于一般二叉树结构的左右子树交换操作,尤其是在二叉树深度不太深,不会导致栈溢出的情况下,能够方便地实现对整个二叉树的遍历和交换。注意事项及可能遇到的问题。

m0_49844997的博客 1598

【数据结构·考研】交换二叉树的左右子树

交换二叉树的左右子树 采用递归算法实现,想要交换 t 的左右子树,首先交换 t 的左子树的左右子树,再交换 t 的右子树的左右子树,最后交换 t 的左右子树,结点为空是边界条件。总的运行情况就是先遍历到树的边缘,然后从下往上交换,直至整棵树的左右子树都被交换。 void swap(Tree& t){ if(t == NULL) return; //空结点返回上一层 swap(t->left); //实现左子树的交换 swap(t->right); //实现右子树的交换

Jiawen9的博客 5890

实验四、1二叉树左右子树交换

Richard的专栏 4618

数据结构之---交换左右子树

递归实现,直接放代码,有兴趣的可以看我后面的详细解析! //将树B的所有节点的左,右子树进行交换 void Swap(BiTree &T){ BiTree temp; if(T){ Swap(T->lchild); Swap(T->rchild); temp=T->lchild; T->lchild=T->rchild; T->r...

weixin_44462351的博客 4665

交换二叉树中所有结点的左右结点

【问题描述】 根据输入的先序遍历序列建立二叉树,输出先、中、后序三种遍历序列,交换二叉树中所有结点的左右孩子,再次输出交换左右孩子后的先、中、后序三种遍历序列。 【输入形式】 输入二叉树先序遍历序列建立二叉树。 【输出形式】 输出交换前、后三种遍历结果。

AIGC 1339

【Python&RS】Rasterio库安装+基础函数使用教程

Rasterio是一个Python库,专门用于栅格数据的读写操作。它支持多种栅格数据格式,如GeoTIFF、ENVI和HDF5,为处理和分析栅格数据提供了强大的工具。RasterIO适用于各种栅格数据应用,如卫星遥感、地图制作等。这篇文章跟大家介绍一下Rasterio库的安装以及一些基本函数的使用教程,附带源码。

Remote Sensing迷途小书童 1万+

求出指定结点在给定二叉树中的层次递归_动画:面试必刷之二叉树的镜像

点击蓝色 “小鹿动画学编程” 关注我哦!加个 “星标” ,每天一篇动画喂饱你!作者 | 小鹿来源 | 小鹿动画学编程题目 请完成一个函数,输入一棵二叉树,请函数输出它的镜像。如下所示:问题分析 根据题目的要求,求出一个二叉树的镜像。首先我们要知道什么是二叉树的镜像,我们通过上图可以得出,镜像就是二叉树的每层节点的左右子树进行相互交换。说白了就是除了根节点外,所有的结点中的左子节点的镜...

weixin_39874809的博客 191

ADS2023仿真变容二极管特性

仿真S-Param仿真控件,设置为Single Point,将频率设置为1MHz,同时勾选Z-parameters,取消S-parameters,从元件库中选择元器件搭建原理图,并根据器件spice提供的相关参数,对原理图中器件参数进行修改,修改完成的电路图如下图所示。添加var控件和MeasEqn控件,相关设置如图所示,Ct为变容管的电容值,Q0为其品质因数。因此,对变容二极管的模型仿真结果是可以信赖的。将其解压,在spice文件夹中,可以找到我们想要的器件参数,和仿真简要电路图。

weixin_45811090的博客 1万+

二叉树习题整理(一)

题目一 编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值 思想 声明一个order用来计数,先序遍历,每遍历一个结点order+1,然后判断k是否等于order,等于则将结点的值域赋给e 代码 Status T641(BiTree T,TElemType *e, int *order,int k) { if(T) { (*order)++; if(*order==k) ...

黑胡子大叔的博客 469

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 379

关于【中孚计算机终端保密检查系统】的卸载

卸载中孚计算机终端保密检查系统

码农之路,向死而生 4万+

剑指 Offer 27. 二叉树的镜像

二叉树的递归分为遍历和分解子问题两种模式。方法一:递归遍历交换每个结点的左右子结点。利用递归前序遍历的框架。

I wanna be myself, where I Belong. 167

比亚迪开放平台接口实战:车身状态监测与智能车联应用开发

本文详细介绍了如何利用比亚迪开放平台的车身状态接口进行智能车联应用开发。通过核心类BYDAutoBodyworkDevice,开发者可以安全获取车辆VIN、车门车窗状态、蓄电池电压、方向盘转角等实时数据,并利用监听器实现状态实时响应。文章提供了从SDK集成、接口调用到典型应用场景(如远程车况检查、车队管理)的完整实战指南,助力开发者快速构建基于比亚迪车辆数据的创新应用。

weixin_29176179的博客 711

[LeetCode]—— 226——翻转二叉树

给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。

小李很执着的博客 694

启动launch文件时显示找不到franka_ign_ros2_control-system...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 694

Spring AI Alibaba实战训练营-28 手把手教你用SAA+ Nacos 构建分布式 MCP 应用

本文介绍如何使用Spring AI Alibaba和Nacos构建分布式MCP应用,实现AI模型与工具服务的动态发现和调用。主要内容包括:1) 项目架构设计,包含MCP Server、Nacos注册中心和MCP Client三个核心组件;2) 环境准备要求,如Java 17+、Maven 3.6+、Nacos 3.1.0+等;3) 详细实施步骤:启动Nacos服务、注册MCP服务端、配置MCP网关聚合服务、设置MCP客户端发现机制。通过这种架构,开发者可以轻松扩展新工具服务,无需修改客户端代码,实现服务动态

program哲学 310

C++实现二叉树的镜像操作(18)---《那些奇怪的算法》

我们需要实现二叉树的镜像操作,问题描述如下: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6

阿华Go,从现在开始的博客 444

科研牛马千万不要错过!手把手教你用AI精准匹配真实参考文献,仅需一个专业应用+两个提示词指令

当然也可以借助生成式AI,如GPT-5.2、Gemini 3 Pro粘贴段落,输入设计好的提示词,让模型根据段落内容匹配参考文献,并正确引用到段落合适位置,再按规范格式输出参考文献列表。阅读我提供的【正文文本】,为其中的关键论点寻找真实的、权威的参考文献(优先来源于Nature, Science, IEEE, ACM, PubMed等),并插入引用。若在段落中已经引用好了参考文献,也有参考文献列表,担心引用位置不当或论点、论述逻辑与文献不够契合,则可以用以下结构化提示词,让AI辅助审查。

智能AI让学术科研更容易 1031

27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

Janna_woo的博客 350

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

翻转二叉树:递归、迭代与层序遍历实现详解

二叉树是数据结构中重要的树形结构,其递归定义使得许多操作天然适合用递归实现。翻转二叉树要求交换每个节点的左右子树,是理解指针操作、递归边界与遍历顺序的经典题目。通过递归、显式栈和层序队列三种方案,不仅能掌握树的遍历,还能体会O(n)时间与O(h)空间复杂度在不同场景下的取舍。该问题在面试与LeetCode刷题中高频出现,也是对称二叉树、深度计算等变式的基础。本文从建树到验证,完整演示如何实现并调试翻转二叉树,帮你彻底吃透这一小而精的算法题。

weixin_26833503的博客 194

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据结构之二叉树基本功能的实现

二叉树的各种性质在这里不再重复,本文实现二叉树的基本操作,包括创建、前序输出、中序输出、后序输出、删除二叉树、叶子结点个数、叶子节点的值、交换左右子树 1.首先创建结构体: typedef struct Tree_Node{ char ch; struct Tree_Node *left; struct Tree_Node *right; }tree; 2.先序创建树 tree *crea...

qq_43060759的博客 623

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

剑指offer66题--Java实现,c++实现和python实现 18.二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 ...

一个有梦想的小码农的博客 160

二叉树实现

<br />#include <iostream> #define MAX 1024 using namespace std; struct node { char ch; node *lefchild,*rightchild; }; //建立二叉树 void createBitree(node* &bitree) { char ch; cin.get(ch); bitree = new node; if(ch == ' ')

dazhi316的专栏 439

翻转二叉树

二叉树翻转是二叉树入门经典高频题目,也是大厂面试常考题(知名 Homebrew 作者面试名题)。不清楚翻转二叉树的本质,只会死记代码,换一道树题就无从下手;分不清递归遍历顺序,疑惑前序、后序到底哪种写法可行;只掌握递归写法,不理解迭代实现,不懂递归底层栈原理;忽略边界条件,遇到空树、单边斜树直接代码报错。核心本质:遍历二叉树全部节点,每访问一个节点就交换它的左右子节点。遍历方式不限:前序、后序递归 DFS、栈 DFS、队列 BFS 全部可行;

2401_83171843的博客 327

秒懂的二叉树左右子树交换(递归实现)

递归实现: 基本思想: 交换左右子树 对左子树进行递归交换 符右子树进行递归交换 递归实现 package a11; public class SwapTree { public static void main(String args[]) { Node root = buildTree(); System.out.println("反转之前==============...

吴创鹏的博客 2万+

树7——交换二叉树的左右子树

交换二叉树的左右子树 二叉树 编写算法,要求实现以下功能: (1)写一个建立二叉树的算法,要求二叉树按照二叉链表存储; (2)已知二叉树用二叉链表存储,要求写出算法,实现将该二叉树左右子树交换。 这是西北大学考研试题。例如,一颗二叉树在左右子树交换前后的情况如下图所示。 这是西北大学考研试题。本题考查二叉树的建立算法思想和左右子树交换算法思想。左右子树交换可用递归实现,类似二叉树的先序...

凌空的桨 1万+
上一篇: 二叉树的中序线索化及遍历
下一篇: 排序二叉树的查找、插入、创建和删除
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值