实现二叉树中所有节点左右子树的交换

一、问题描述二叉树是一种常见的特殊的树型结构,在计算机领域有着极为广泛的应用。

在二叉树的一些应用中,常常要求在树中查找具有某些特征的结点或者对树中全部结点逐一进行某种处理,这就提出了遍历二叉树。

根据遍历的方向的不同,有前序遍历、中序遍历、后序遍历以及层序遍历。

在本次课程设计中,要求学生通过编写程序完成对二叉树的一些操作,比如可以构造二叉树、打印二叉树、遍历二叉树以及对左右子树进行交换等等。

二、基本要求要求:。

构造一颗20个节点的完全二叉树或者20个节点以上的满二叉树。

实现如下步骤:(1)实现二叉树的构造过程,并打印出二叉树(2)对该二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历;(3)将该二叉树的所有左右子树进行交换,得到新的二叉树,并打印出该二叉树;(4)对新获得的二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历。

三、数据结构的设计由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序二叉树的构造是采用二叉链表的链式存储结构,链表中的结点应包含三个域:数据域和左、右孩子的指针域。

这种存储结构可以方便二叉树的建立以及遍历。

1、结点的数据结构struct node{char data;struct node *lchild,*rchild;}2、基本操作void Create(BiTNode **p)初始条件:按照结点的结构体构造二叉树;操作结果:构造一棵二叉树。

主函数打印二叉树左右子树交换void PreOrderTraverse(BiTree T)初始条件:二叉树T存在;操作结果:按照前序遍历方法遍历二叉树。

void InOrderTraverse(BiTree T)初始条件:二叉树T存在;操作结果:按照中序遍历方法遍历二叉树。

void PostOrderTraverse(BiTree T)初始条件:二叉树T存在;操作结果:按照后序遍历方法遍历二叉树。

void LevelOrderTraverse(BiTree T)初始条件:二叉树T存在;操作结果:按照层序遍历方法遍历二叉树。

void SwapChild(BiTNode **p)初始条件:二叉树存在且交换的结点有子树;操作结果:将二叉树左右结点交换。

void Paint(BiTree T)初始条件:二叉树T存在;操作结果:将二叉树的结点打印出来。

四、软件模块结构图构造二叉树菜单函数遍历函数五、 1、程序设计基本思想(1)本实验要求编写一个程序实现对二叉树的各种基本操作,并以此为目的设计一个程序,完成如下功能:1、输入二叉树的先序序列字符,建立二叉链表。

注意:输入时,必须加入虚结点以示空指针的位置;假设虚结点输入时用空格字符表示。

2、打印二叉树。

3、按先序、中序、后序和层序三种不同方法遍历二叉树。

4、交换二叉树的所有左右子树。

5、打印二叉树,并且分别按照先序、中序、后序和层序三种不同方法遍历二叉树。

6、在设计一个简单的菜单,分别调试上述算法。

7、编写主程序完成各功能的调用和实现。

(2)测试数据:1、按照先序序列依次输入字符。

2、打印二叉树并且按先序、中序和后序遍历二叉树并输出遍历结果。

3、输出交换二叉树的左右子树并且打印二叉树并且按先序、中序和后序遍历二叉树并输出遍历结果。

2、程序设计基本思想本程序含有7个函数;①主函数main( )②前序遍历二叉树PreOrderTraverse(T,PrintChar) ③中序遍历二叉树Inorder(T)④后续遍历二叉树Postorder(T)⑤层序遍历二叉树LevelOrderTraverse(T) 后序遍历 层序遍历中序遍历前序遍历⑥打印二叉树Paint (T )⑦交换二叉树所有左右子树SwapChild(T)六、程序流程图1、创建函数Y Nvoid Create(BiTNode **p){char e;开输入输新二叉树结空e=getchar();if(e=='*')(*p)=NULL;else{if(!((*p)=(BiTree)malloc(sizeof(BiTNode)))) {printf("分配失败\n");exit(0);}(*p)->data=e;Create(&((*p)->lchild));Create(&((*p)->rchild));}}2、前序遍历函数Y 开是结点N输出根节点前序遍历左子前序遍历右子遍历完成结void PreOrderTraverse(BiTree T) {if(T){printf("%c ",T->data);PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild); }}3、中序遍历函数YN开是中序遍历右子中序遍历左子输出根节点 遍历完成 结点void InOrderTraverse(BiTree T){if(T){InOrderTraverse(T->lchild);printf("%c ",T->data);InOrderTraverse(T->rchild);}}4、后序遍历函数N结开是结点Y后序遍历左子后序遍历右子输出结点遍历完成结void PostOrderTraverse(BiTree T){if(T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);printf("%c ",T->data);}}5、层序遍历函数void LevelOrderTraverse(BiTree T) {BiTree Q[MaxLength];int front=0,rear=0;BiTree p;//根结点入队if(T){Q[rear]=T;rear=(rear+1)%MaxLength;//插入结点为新的队尾元素}while(front!=rear){//队头元素出队p=Q[front];front=(front+1)%MaxLength;//删除头结点printf("%c ",p->data);//左孩子不为空,入队if(p->lchild){Q[rear]=p->lchild;rear=(rear+1)%MaxLength;//插入左孩子结点为新的队尾元素 } P=root访问节点P,P 为N 队为出队—>P, 结束YN Y//右孩子不为空,入队if(p->rchild){Q[rear]=p->rchild; rear=(rear+1)%MaxLength;//插入右孩子结点为新的队尾元素 }}}6、左右子树交换函数N开有结点BTNoY交换子树交换完成结//交换左右子树(递归算法)void SwapChild(BiTNode **p){BiTNode *temp;if((*p)){//交换左右子树指针temp=(*p)->lchild;(*p)->lchild=(*p)->rchild;(*p)->rchild=temp;SwapChild(&((*p)->lchild));SwapChild(&((*p)->rchild));}}7、二叉树打印函数//打印二叉树(采用凹入表横向打印)void Paint(BiTree T,int n){char c;if(T){Paint(T->rchild,n+1);printf("%*c",4*n,T->data);if(T->lchild&&T->rchild)c='<';elseif(T->rchild)c='/';elseif(T->lchild)c='\\';elsec=' ';printf("%c\n",c);Paint(T->lchild,n+1);}}8、遍历调用函数//遍历函数(调用层序,前序,中序,后序遍历函数)开结输入1 前 序 遍2 中 序 遍3 后 序 遍 4层序遍void OrderTraverse(BiTree T){printf("层序遍历: ");LevelOrderTraverse(T);printf("\n");printf("前序遍历: ");PreOrderTraverse(T);printf("\n");printf("中序遍历: ");InOrderTraverse(T);printf("\n");printf("后序遍历: ");PostOrderTraverse(T);printf("\n");}9、菜单函数//主菜单函数(显示系统功能,获取用户输入)void menu(int *choice){printf("-------------欢迎使用-------------\n");printf("1.建立二叉树(前序)\n");printf("2.打印二叉树\n");printf("3.遍历二叉树(层序,前序,中序,后序)\n");printf("4.交换左右子树\n");printf("0.退出\n");printf("----------------------------------\n");printf("你的选择: ");scanf("%d",choice);getchar(); //很重要,存储回车,避免对后面函数的影响}/**************************************************************/10、主函数开结输入1 建 立 二 2 打 印 二 3 遍 历 二 4 交 换 左 右 0 退/***************************主函数****************************/ //根据用户的输入,调用相应的子函数main(){BiTree T=NULL; //定义二叉树并默认为空int choice;while(1){menu(&choice); //显示主菜单switch(choice) //根据不同选择,实现相应操作{case 1: //创建二叉树{printf("输入各元素,空子树用'*'表示\n");Create(&T);printf("创建成功!\n\n");} break;case 2: //打印二叉树{if(T){printf("打印结果:\n");Paint(T,1);}elseprintf("二叉树为空!\n");printf("\n");} break;case 3: //遍历二叉树{if(T)OrderTraverse(T);elseprintf("二叉树为空!\n");printf("\n");} break;case 4: //交换左右子树{SwapChild(&T);printf("交换成功!\n");printf("\n");} break;case 0: exit(0); //退出default: printf("无效输入!\n\n");}}}/****************************************************************/ 七、源程序代码/********************头文件、宏定义和存储结构********************///用到的头文件#include<stdio.h>#include<stdlib.h>//队列最大结点数目#define MaxLength 100//定义二叉树的存储结构(二叉链表)typedef struct node{char data;struct node *lchild,*rchild;} BiTNode,*BiTree;/**************************************** ************************//*************************各功能函数的定义***********************//**************创建、遍历、交换、打印、主菜单函数****************///创建二叉树(前序)void Create(BiTNode **p){char e;e=getchar();if(e=='*')(*p)=NULL;else{if(!((*p)=(BiTree)malloc(sizeof(BiTNode)))){printf("分配失败\n");exit(0);}(*p)->data=e;Create(&((*p)->lchild));Create(&((*p)->rchild));}}//递归前序遍历void PreOrderTraverse(BiTree T){if(T){printf("%c ",T->data);PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}}//递归中序遍历void InOrderTraverse(BiTree T) {if(T){InOrderTraverse(T->lchild);p rintf("%c ",T->data);InOrderTraverse(T->rchild); }}//递归后序遍历void PostOrderTraverse(BiTree T) {if(T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);printf("%c ",T->data);}}//层序遍历(利用循环队列)void LevelOrderTraverse(BiTree T) {BiTree Q[MaxLength];int front=0,rear=0;BiTree p;//根结点入队if(T){Q[rear]=T;rear=(rear+1)%MaxLength; }while(front!=rear){//队头元素出队p=Q[front];front=(front+1)%MaxLength;printf("%c ",p->data);//左孩子不为空,入队if(p->lchild){Q[rear]=p->lchild;rear=(rear+1)%MaxLength;}//右孩子不为空,入队if(p->rchild){Q[rear]=p->rchild;rear=(rear+1)%MaxLength;}}}//交换左右子树(递归,类似于先序遍历)void SwapChild(BiTNode **p){BiTNode *temp;if((*p)){//交换左右子树指针temp=(*p)->lchild;(*p)->lchild=(*p)->rchild;(*p)->rchild=temp;SwapChild(&((*p)->lchild));SwapChild(&((*p)->rchild));}}//打印二叉树(采用凹入表横向打印)void Paint(BiTree T,int n){char c;if(T){Paint(T->rchild,n+1);printf("%*c",4*n,T->data);if(T->lchild&&T->rchild)c='<';elseif(T->rchild)c='/';elseif(T->lchild)c='\\';elsec=' ';printf("%c\n",c);Paint(T->lchild,n+1);}}//遍历函数(调用层序,前序,中序,后序遍历函数)void OrderTraverse(BiTree T){printf("层序遍历: ");LevelOrderTraverse(T);printf("\n");printf("前序遍历: "); PreOrderTraverse(T);printf("\n");printf("中序遍历: ");InOrderTraverse(T);printf("\n");printf("后序遍历: "); PostOrderTraverse(T);printf("\n");}//主菜单(显示系统功能,获取用户输入)void menu(int *choice){printf("-------------欢迎使用-------------\n"); printf("1.建立二叉树(前序)\n");printf("2.打印二叉树\n");printf("3.遍历二叉树(层序,前序,中序,后序)\n");printf("4.交换左右子树\n");printf("0.退出\n");printf("----------------------------------\n"); printf("你的选择: ");scanf("%d",choice);getchar(); //很重要,存储回车,避免对后面函数的影响}/**************************************** ************************//***************************主函数*******************************///根据用户的输入,调用相应的子函数main(){BiTree T=NULL; //定义二叉树并默认为空int choice;while(1){menu(&choice); //显示主菜单switch(choice) //根据不同选择,实现相应操作{case 1: //创建二叉树{printf("输入各元素,空子树用'*'表示\n");Create(&T);printf("创建成功!\n\n");} break;case 2: //打印二叉树{if(T){printf("打印结果:\n");Paint(T,1);}elseprintf("二叉树为空!\n");printf("\n");} break;case 3: //遍历二叉树{if(T)OrderTraverse(T);elseprintf("二叉树为空!\n");printf("\n");} break;case 4: //交换左右子树{SwapChild(&T);printf("交换成功!\n");printf("\n");} break;case 0: exit(0); //退出default: printf("无效输入!\n\n");}}}/**************************************** ************************/八、调试分析运行程序,例如:输入如下图所示的有20个结点的完全二叉树。

合集下载

二叉树的左右子树交换

二叉树的左右子树交换

#include<stdio.h>#include<malloc.h>#include<conio.h>typedef struct BiTreeNode{int data;struct BiTreeNode *lchild,*rchild;}BiTreeNode,*Bitree;void Inorder(BiTreeNode *Bt){if(Bt!=NULL){Inorder(Bt->lchild);printf("%d ",Bt->data);Inorder(Bt->rchild);}}void InsertBST(BiTreeNode *&Bt,int k){if(Bt==NULL){Bt=(BiTreeNode *)malloc(sizeof(BiTreeNode));Bt->data=k;Bt->lchild=NULL;Bt->rchild=NULL;}else{if(Bt->data>k){InsertBST(Bt->lchild,k);}if(Bt->data<k){InsertBST(Bt->rchild,k);}}}void Exchang(BiTreeNode *&Bt){if(Bt!=NULL){BiTreeNode *r;Bt->lchild=Bt->rchild;Bt->rchild=r;Exchang(Bt->lchild);Exchang(Bt->rchild);}}main(){BiTreeNode *Bt=NULL;printf("please input data and end with 0:\n");int k;scanf("%d",&k);while(k!=0){InsertBST(Bt,k);scanf("%d",&k);}Inorder(Bt);printf("\nthe order after exchanging is:\n");#include<stdio.h>#include<malloc.h>#include<conio.h>typedef struct BiTreeNode{int data;struct BiTreeNode *lchild,*rchild;}BiTreeNode,*Bitree;void Inorder(BiTreeNode *Bt){if(Bt!=NULL){Inorder(Bt->lchild);printf("%d ",Bt->data);Inorder(Bt->rchild);}}void InsertBST(BiTreeNode *&Bt,int k){if(Bt==NULL){Bt=(BiTreeNode *)malloc(sizeof(BiTreeNode));Bt->data=k;Bt->rchild=NULL;}else{if(Bt->data>k){InsertBST(Bt->lchild,k);}if(Bt->data<k){InsertBST(Bt->rchild,k);}}}void Exchang(BiTreeNode *&Bt){if(Bt!=NULL){BiTreeNode *r;r=Bt->lchild;Bt->lchild=Bt->rchild;Bt->rchild=r;Exchang(Bt->lchild);Exchang(Bt->rchild);}}main(){BiTreeNode *Bt=NULL;printf("please input data and end with 0:\n");int k;scanf("%d",&k);while(k!=0){InsertBST(Bt,k);scanf("%d",&k);}Inorder(Bt);printf("\nthe order after exchanging is:\n");Exchang(Bt);Inorder(Bt);getch(); Exchang(Bt);Inorder(Bt);getch();}。

实现二叉树中所有节点左右子树的交换

实现二叉树中所有节点左右子树的交换

实现二叉树中所有节点左右子树的交换在二叉树中,交换每个节点的左右子树可以通过递归算法实现。

让我们来看看如何实现这个功能。

首先,我们需要定义一个二叉树的节点类(Node),该类包含一个值属性和左右子树属性。

我们还可以添加一些其他方法来获取和设置节点的值以及左右子树。

```pythonclass Node:def __init__(self, value):self.value = valueself.left = Noneself.right = None```接下来,我们可以定义一个函数来交换每个节点的左右子树。

遍历二叉树的每个节点,并通过交换节点的左右子树来实现。

```pythondef swap_tree(node):if node is None:returntemp = node.leftnode.left = node.rightnode.right = tempswap_tree(node.left)swap_tree(node.right)```我们可以使用先序遍历的方法来遍历二叉树,即先访问根节点,然后递归地遍历左子树和右子树。

在遍历每个节点时,我们交换其左右子树。

最后,我们可以在一个示例二叉树上测试我们的代码。

假设我们有以下二叉树:```/\23/\\456```下面是测试代码和输出结果:```python#创建二叉树root = Node(1)root.left = Node(2)root.right = Node(3)root.left.left = Node(4)root.left.right = Node(5)root.right.right = Node(6)#交换每个节点的左右子树swap_tree(root)#打印交换后的二叉树#输出结果:132654def print_tree(node):if node is None:returnprint(node.value, end=" ")print_tree(node.left)print_tree(node.right)print_tree(root)```以上代码将输出交换后的二叉树的先序遍历结果:132654、可以看到,通过交换每个节点的左右子树,我们成功地改变了二叉树的结构。

5-21交换二叉树 西电

5-21交换二叉树 西电

//交换左右子树的程序代码#include<stdio.h>#include<malloc.h>//二叉链表的结构类型定义const int maxsize=1024;typedef char datatype;typedef struct node{datatype data;struct node *lchild,*rchild;}bitree;bitree*creattree();void preorder(bitree*);void swap(bitree*);void main(){bitree*pb;pb=creattree();preorder(pb);printf("\n");swap(pb);preorder(pb);printf("\n");}//二叉树的建立bitree*creattree(){char ch;bitree*Q[maxsize];int front,rear;bitree*root,*s;root=NULL;front=1;rear=0;printf("按层次输入二叉树,虚结点输入'@',以'#'结束输入:\n");while((ch=getchar())!='#'){s=NULL;if(ch!='@'){s=(bitree*)malloc(sizeof(bitree));s->data=ch;s->lchild=NULL;s->rchild=NULL;}rear++;Q[rear]=s;if(rear==1)root=s;else{if(s&&Q[front])if(rear%2==0)Q[front]->lchild=s;else Q[front]->rchild=s;if(rear%2==1)front++;}}return root;}//先序遍历按层次输出二叉树void preorder(bitree*p){if(p!=NULL){printf("%c",p->data);if(p->lchild!=NULL||p->rchild!=NULL){printf("(");preorder(p->lchild);if(p->rchild!=NULL)printf(",");preorder(p->rchild);printf(")");}}}//交换左右子树void swap(bitree*p){bitree*t;if(p!=NULL){if(p->lchild!=NULL&&p->rchild!=NULL&&p->lchild->data>p->rchild->data){t=p->lchild;p->lchild=p->rchild;p->rchild=t;}swap(p->lchild);swap(p->rchild);}}。

数据结构 树 考试习题

数据结构 树 考试习题

第五章树11.不含任何结点的空树( )A)是一棵树 B)是一棵二叉树C)既不是树也不是二叉树 D)是一棵树也是一棵二叉树12.二叉树是非线性数据结构,所以( )A)它不能用顺序存储结构存储; B)它不能用链式存储结构存储;C)顺序存储结构和链式存储结构都能存储; D)顺序存储结构和链式存储结构都不能使用13.把一棵树转换为二叉树后,这棵二叉树的形态是( )A)唯一的 B)有多种C)有多种,但根结点都没有左孩子 D)有多种,但根结点都没有右孩子9. 11 , 8 , 6 , 2 , 5 的叶子结点生成一棵哈夫曼树,它的带权路径长度为()A) 24 B) 72 C) 48 D) 5310.一棵含18个结点的二叉树的高度至少为( )A) 3 B) 4 C) 6 D) 511.下面的二叉树中,( C )不是完全二叉树。

10. 设结点x和结点y是二叉树T中的任意两个结点,若在前序序列中x在y之前,而在中序序列中x在y之后,则x和y的关系是()A)x是y的左兄弟 B)x是y的右兄弟C)y是x的祖先 D)y是x的孩子11.设二叉树根结点的层次为1,所有含有15个结点的二叉树中,最小高度是()A) 6 B) 5 C) 4 D) 37.下列陈述中正确的是()A)二叉树是度为2的有序树B)二叉树中结点只有一个孩子时无左右之分C)二叉树中必有度为2的结点D)二叉树中最多只有两棵子树,并且有左右之分8. 树最适合用来表示()A)有序数据元素 B)无序数据元素C)元素之间具有分支层次关系的数据 D)元素之间无联系的元素9. 3个结点有()不同形态的二叉树A) 2 B) 3 C) 4 D) 56.二叉树是非线性数据结构,( )A)它不能用顺序存储结构存储; B)它不能用链式存储结构存储;C)顺序存储结构和链式存储结构都能存储;D)顺序存储结构和链式存储结构都不能使用7.二叉树上叶结点数等于( )A ) 分支结点数加1B ) 单分支结点数加1C ) 双分支结点数加1D ) 双分支结点数减18.如将一棵有n个结点的完全二叉树按顺序存放方式,存放在下标编号为0, 1,…, n-1的一维数组中,设某结点下标为k(k>0),则其双亲结点的下标是( )A ) (k-1)/2B ) (k+1)/2C ) k/2D ) k-18. 树最适合用来表示()。

二叉树和树的转换算法

二叉树和树的转换算法

二叉树和树的转换算法二叉树和树之间的转换算法涉及将一个数据结构转换为另一个数据结构的过程。

在这里,我们将讨论将树转换为二叉树和将二叉树转换为树的算法。

首先,让我们来讨论将树转换为二叉树的算法。

树是一种非线性数据结构,它包含一个根节点以及零个或多个子树,每个子树也是一棵树。

而二叉树是一种特殊的树,每个节点最多有两个子节点。

因此,将树转换为二叉树的算法需要考虑如何安排节点的子节点,以便符合二叉树的定义。

一种常见的将树转换为二叉树的算法是使用前序遍历。

具体步骤如下:1. 从树的根节点开始,将其作为二叉树的根节点。

2. 对于树的每个子树,将其第一个子节点作为二叉树的左子节点,将其余的子节点作为左子节点的右子节点。

3. 递归地对每个子树执行上述步骤,直到整棵树都被转换为二叉树。

接下来,让我们来讨论将二叉树转换为树的算法。

二叉树是一种特殊的树,每个节点最多有两个子节点。

而树是一种非线性数据结构,每个节点可以有任意数量的子节点。

因此,将二叉树转换为树的算法需要考虑如何将二叉树的节点重新组织成树的节点。

一种常见的将二叉树转换为树的算法是使用后序遍历。

具体步骤如下:1. 从二叉树的根节点开始,将其作为树的根节点。

2. 对于二叉树的每个节点,如果该节点有右子节点,将其右子节点作为树节点的子节点。

3. 递归地对每个节点执行上述步骤,直到整棵二叉树都被转换为树。

需要注意的是,在进行树和二叉树的转换时,可能会涉及到节点的重新连接和指针的调整,需要仔细处理节点之间的关系,确保转换后的数据结构仍然保持原始树或二叉树的结构特点。

总之,树和二叉树之间的转换算法涉及到对节点的重新组织和连接,需要根据具体的数据结构特点来设计相应的算法。

希望这些信息能够帮助你理解树和二叉树之间的转换过程。

交换左右子树

交换左右子树

交换左右⼦树可能编译时会有些语法⼩错误(⽐如分号,->,等),很容易就⾃⼰纠正了哦,思路绝对是完全正确的,所以⽤的话就⾃⼰试着改改吧,直接复制粘贴,就正确,岂不是太没写代码体验了,⾃⼰改改才印象更加深刻的呢(▽)~~~~;交换左右⼦树//算法5.5 计算⼆叉树的深度,增加左右⼦数交换等功能#include<iostream>using namespace std;//⼆叉树的⼆叉链表存储表⽰typedef struct BiNode{char data; //结点数据域struct BiNode *lchild,*rchild; //左右孩⼦指针}BiTNode,*BiTree;//⽤算法5.3建⽴⼆叉链表void CreateBiTree(BiTree &T){//按先序次序输⼊⼆叉树中结点的值(⼀个字符),创建⼆叉链表表⽰的⼆叉树Tchar ch;cin >> ch;if(ch=='#') T=NULL; //递归结束,建空树else{T=new BiTNode;T->data=ch; //⽣成根结点CreateBiTree(T->lchild); //递归创建左⼦树CreateBiTree(T->rchild); //递归创建右⼦树} //else} //CreateBiTreeint Depth(BiTree T){int m,n;if(T == NULL ) return 0; //如果是空树,深度为0,递归结束else{m=Depth(T->lchild); //递归计算左⼦树的深度记为mn=Depth(T->rchild); //递归计算右⼦树的深度记为nif(m>n) return(m+1); //⼆叉树的深度为m 与n的较⼤者加1else return (n+1);}}void InOrderTraverse(BiTree T){//中序遍历⼆叉树T的递归算法if(T){InOrderTraverse(T->lchild);cout << T->data;InOrderTraverse(T->rchild);}}void inChangeLR(BiTree &T){BiTree temp;if(T){if(T->lchild==NULL&&T->rchild==NULL){return;} else{temp=T->lchild;T->lchild = T->rchild;T->rchild=temp;}inChangeLR(T->lchild);inChangeLR(T->rchild);}}void preChangeLR(BiTree &T){BiTree temp;if(T){inChangeLR(T->lchild);if(T->lchild==NULL&&T->rchild==NULL){return;} else{temp=T->lchild;T->lchild = T->rchild;T->rchild=temp;}inChangeLR(T->rchild);}}void postChangeLR(BiTree &T){BiTree temp;if(T){inChangeLR(T->lchild);inChangeLR(T->rchild);if(T->lchild==NULL&&T->rchild==NULL){ return;} else{temp=T->lchild;T->lchild = T->rchild;T->rchild=temp;}}}int main(){BiTree tree;cout<<"请输⼊建⽴⼆叉链表的序列:\n";CreateBiTree(tree);InOrderTraverse(tree);cout<<"数的深度为:"<<Depth(tree)<<endl; cout<<"中序遍历的结果为:\n";InOrderTraverse(tree);cout<<"\n";//以下三种执⾏其中⼀种cout<<"交换后中序遍历的结果为:\n";inChangeLR(tree);InOrderTraverse(tree);cout<<"\n";cout<<"交换后前序序遍历的结果为:\n";preChangeLR(tree);InOrderTraverse(tree);cout<<"\n";cout<<"交换后后序遍历的结果为:\n";postChangeLR(tree);InOrderTraverse(tree);return 0;}。

写出二叉树中左右节点互换的算法精品

写出二叉树中左右节点互换的算法精品1.递归实现:递归是一种常见的解决树相关问题的方法。

对于二叉树的左右节点互换,我们可以按照以下步骤进行递归实现:1)如果当前节点为空,则返回。

2)交换当前节点的左子树和右子树。

3)递归调用左子树。

4)递归调用右子树。

以下是递归实现的示例代码:```javapublic void invertTree(TreeNode root)if (root == null)return;}//交换当前节点的左子树和右子树TreeNode temp = root.left;root.left = root.right;root.right = temp;//递归调用左子树和右子树invertTree(root.left);invertTree(root.right);```这个算法是比较简单和直观的,对于每个节点,我们交换其左子树和右子树,然后递归交换其左子节点和右子节点。

2.非递归实现:使用非递归的方式实现二叉树中左右节点互换可以通过迭代算法,即使用栈或队列来辅助完成。

下面是一种常见的基于栈的非递归实现方法:首先将根节点入栈,然后进入循环直到栈为空。

在循环中,首先弹出栈顶节点,然后交换其左子节点和右子节点。

如果弹出的节点存在左子节点,则将左子节点入栈;如果弹出的节点存在右子节点,则将右子节点入栈。

重复这个过程直到栈为空。

以下是非递归实现的示例代码:```javapublic void invertTree(TreeNode root)if (root == null)return;}//创建一个栈,并将根节点入栈Stack<TreeNode> stack = new Stack<>(;stack.push(root);while (!stack.empty()TreeNode node = stack.pop(;//交换当前节点的左子树和右子树TreeNode temp = node.left;node.left = node.right;node.right = temp;//如果当前节点存在左子节点,则将左子节点入栈if (node.left != null)stack.push(node.left);}//如果当前节点存在右子节点,则将右子节点入栈if (node.right != null)stack.push(node.right);}}```3.层序遍历实现:层序遍历是一种广度优先(BFS)的方法,它按照树的层级从上到下访问每个节点。

c交换左右子树的算法非递归

c交换左右子树的算法非递归前言:本文旨在介绍一种非递归的交换左右子树的算法,通过该算法,可以在C语言中实现树结构的左右子树交换操作。

树是一种常见的数据结构,广泛应用于计算机科学中,而交换左右子树是树操作中的一种常见操作。

本文将详细介绍该算法的实现过程和代码示例。

一、算法描述:非递归交换左右子树算法的基本思路是使用栈来模拟递归过程。

首先,将根节点入栈,同时将根节点的左子树和右子树分别压入另一个栈中。

然后,依次弹出左子树和右子树的节点,并交换它们的左右子节点。

当所有节点都被弹出后,再将根节点从另一个栈中弹出,并交换其左右子树。

二、代码实现:以下是一个基于上述算法的C语言代码实现示例:```c#include <stdio.h>#include <stdlib.h>// 定义树节点结构体typedef struct TreeNode {int val;struct TreeNode* left;struct TreeNode* right;} TreeNode;// 非递归交换左右子树函数void swap_subtrees(TreeNode* root) {// 创建一个空栈来模拟递归过程TreeNode* stack[100];int top = -1;stack[++top] = root; // 将根节点入栈while (top >= 0) {TreeNode* node = stack[top--]; // 弹出当前节点if (node->left) { // 如果当前节点有左子树,将其压入另一个栈中stack[++top] = node->left;}if (node->right) { // 如果当前节点有右子树,将其压入另一个栈中stack[++top] = node->right;}}// 交换左右子树TreeNode* temp = root->left; // 保存当前节点的左子树root->left = root->right; // 交换当前节点的左右子树root->right = temp; // 将保存的左子树重新赋值给当前节点的右子树}```三、使用示例:以下是一个简单的使用示例,展示如何使用上述代码实现交换左右子树的操作:```cint main() {// 创建一棵二叉树并初始化数据TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));root->val = 1;root->left = (TreeNode*)malloc(sizeof(TreeNode));root->left->val = 2;root->right = (TreeNode*)malloc(sizeof(TreeNode));root->right->val = 3;root->left->left = NULL; // 左子树为空树结构root->right->right = NULL; // 右子树为空树结构// 交换左右子树并输出结果swap_subtrees(root);printf("交换后的二叉树为:\n");print_tree(root); // 输出二叉树结构,以验证交换结果是否正确return 0;}```四、总结:本文介绍了非递归的交换左右子树的算法,并给出了相应的C语言代码实现示例。

可交换左右孩子的二叉树

#include <stdio.h>#include <malloc.h>#include <conio.h>#include<stdlib.h>#define MaxSize 100typedef char ElemType;typedef struct node{ElemType data;//数据元素struct node *lchild; //指向左孩子struct node *rchild; //指向右孩子} BTNode;void CreateBTNode(BTNode *&b,char *str)//创建二叉树{BTNode *st[MaxSize],*p=NULL;//BTNode *st[MaxSize]定义了一个栈,以栈的方式来实现二叉树元素的录入int top=-1,k,j=0;char ch;b=NULL;ch=str[j];while(ch!='\0'){switch(ch){case'(':top++;st[top]=p;k=1;break;case')':top--;break;case',':k=2;break;default:p=(BTNode *)malloc(sizeof(BTNode));p->data=ch;p->lchild=p->rchild=NULL;if(b==NULL){b=p;}else{switch(k){case 1:st[top]->lchild=p;break;case 2:st[top]->rchild=p;break;}}}j++;ch=str[j];}}BTNode *findNode(BTNode *b,ElemType x)//查找结点,找到结点后返回其指针,否则返回空指针{BTNode *p;if(b==NULL){return NULL;}else{if(b->data==x){return b;}else{p=findNode(b->lchild,x);if(p!=NULL){return p;}else{return findNode(b->rchild,x);}}}}int nodes(BTNode *b){int num1,num2;if(b==NULL)//原错误语句:b->data==NULL{return 0;}else{num1=nodes(b->lchild);num2=nodes(b->rchild);return (num1+num2+1);}}int yezinodes(BTNode *b)//叶子结点个数{int num1,num2;if(b==NULL){return 0;}else{if(b->lchild==NULL&&b->rchild==NULL){return 1;}else{num1=yezinodes(b->lchild);num2=yezinodes(b->rchild);return(num1+num2);}}}void parent(BTNode *b,ElemType x)//查找双亲{BTNode *t;if(b==NULL){return;}else{if(b->data==x){printf("此结点是根结点,无双亲!\n");return;}else{if(b->lchild!=NULL&&b->lchild->data==x||b->rchild!=NULL&&b->rchild->data==x) {t=b;printf("此结点的双亲为:%c\n",t->data);return;}else{parent(b->lchild,x);parent(b->rchild,x);}}}}void BTreeChange(BTNode *&b)//交换左右孩子算法{BTNode *p;if(b==NULL){return;}else{if(b->lchild==NULL&&b->rchild==NULL){return ;}else{p=b->lchild;b->lchild=b->rchild;b->rchild=p;BTreeChange(b->lchild);BTreeChange(b->rchild);}}}BTNode *LchildNode(BTNode *p)//找左孩子结点问题:这边的函数该如何引用{return p->lchild;}BTNode *RchildNode(BTNode *p)//找右孩子结点{return p->rchild;}int BTNodeHeight(BTNode *b)//求树的高度{int lchild,rchild;if(b==NULL){return (0);}else{lchild=BTNodeHeight(b->lchild);rchild=BTNodeHeight(b->rchild);return (lchild>rchild)?(lchild+1):(rchild+1);}}void DispBTNode(BTNode *b)//输出二叉树{if(b!=NULL){printf("%c",b->data);if(b->lchild!=NULL||b->rchild!=NULL){printf("(");DispBTNode(b->lchild);if(b->rchild!=NULL){printf(",");}DispBTNode(b->rchild);printf(")");}}}void PreOrder(BTNode *b, int i)//前序遍历{if(b!=NULL){printf("%c %d \n",b->data,i);PreOrder(b->lchild,i+1);PreOrder(b->rchild,i+1);}}void InOrder(BTNode *b)//中序遍历{if(b!=NULL){InOrder(b->lchild);printf("%c",b->data);InOrder(b->rchild);}}void PostOrder(BTNode *b)//后序遍历{if(b!=NULL){PostOrder(b->lchild);PostOrder(b->rchild);printf("%c",b->data);}}void main(){char cc[]={"A(B(D(,G)),C(E,F))"};BTNode *b;BTNode *q;BTNode *t;char c;int p;printf("创建二叉树!\n");CreateBTNode(b,cc); //CreateBTNode函数用于根据括号表示法构建二叉链表,此函数在实验指导书上printf("创建二叉树成功!\n");printf("1.二叉树的括号表示法为:\n");DispBTNode(b);printf("\n");p=BTNodeHeight(b);printf("2.二叉树的深度为:%d\n",p);printf("3.二叉树的结点总数为:%d\n",nodes(b));printf("4.二叉树的叶子结点个数为:%d\n",yezinodes(b));printf("5.请输入一个结点:\n");scanf("%c",&c);t=findNode(b,c);if(t==NULL){printf("二叉树为空!\n");}else{if(t->lchild!=NULL){printf("此结点的左孩子是:%c\n",LchildNode(t)->data);}else{printf("此结点的左孩子不存在!\n");}if(t->rchild!=NULL){printf("此结点的右孩子是:%c\n",RchildNode(t)->data);}else{printf("此结点的右孩子不存在!\n");}}parent(b,c);printf("\n");printf("6.二叉树的前序遍历为:\n");PreOrder(b,0);printf("\n");printf("7.二叉树的中序遍历为:\n");InOrder(b);printf("\n");printf("8.二叉树的后序遍历为:\n");PostOrder(b);printf("\n");BTreeChange(b);printf("交换后的二叉树输出如下:\n");DispBTNode(b);printf("\n");}。

实现二叉树中所有节点左右子树的交换

数据结构课程设计实验报告题目名称:实现二叉树中所有节点左右子树的交换学院:信息科学与工程学院专业班级:计算机科学与技术1003班姓名:叶成功学号:指导教师:陈国良教授李立三教授日期:2012年7月3日目录二、基本要求 .............................................................................................................................三、数据结构的设计 .................................................................................................................1、结点的数据结构 ...............................................................................................................2、基本操作 ...........................................................................................................................四、软件模块结构图 .................................................................................................................五、程序设计思想 .....................................................................................................................1、程序设计基本思想 ...........................................................................................................2、程序设计基本思想 ...........................................................................................................六、程序流程图 .........................................................................................................................1、创建函数 ...........................................................................................................................2、前序遍历函数 ...................................................................................................................3、中序遍历函数 ...................................................................................................................4、后序遍历函数 ...................................................................................................................5、层序遍历函数 ...................................................................................................................6、左右子树交换函数 ...........................................................................................................7、二叉树打印函数 ...............................................................................................................8、遍历调用函数 ...................................................................................................................9、菜单函数 ...........................................................................................................................10、主函数 .............................................................................................................................七、源程序代码 .........................................................................................................................八、调试分析 .............................................................................................................................九、数据测试 .............................................................................................................................1、主菜单界面 .......................................................................................................................2、建立一棵有二十个结点的完全二叉树 ...........................................................................3、打印二叉树 .......................................................................................................................4、遍历二叉树 .......................................................................................................................5、二叉树左右子树交换 .......................................................................................................6、交换后打印二叉树 ...........................................................................................................7、交换后二叉树的遍历 .......................................................................................................8、退出程序 ...........................................................................................................................十、用户使用手册 .....................................................................................................................十一、心得体会 .........................................................................................................................一、问题描述二叉树是一种常见的特殊的树型结构,在计算机领域有着极为广泛的应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档