交换二叉树中各个节点的左右孩子

1、算法思想

使用后序比遍历,递归实现交换左右孩子!

2、算法实现

——————————————————————————————————————————————————
#include<string.h>
#include<stdio.h>
#define MaxSize 20
#include
#include<stdlib.h>
#include “queue”
#define endl ‘\n’
using namespace std;
typedef struct BiTNode{ //结点
char data; //数据域
struct BiTNode *lchild,*rchild; //指针域
}BiTNode,*BiTree;
——————————————————————————————————————————————————
//先序遍历的顺序建立二叉链表
void CreateTree(BiTree &T){
char ch;
cin>>ch;
if (ch == ‘#’) T = NULL; //递归结束,建立空树
else{
T = new BiTNode; //申请一个结点
T->data = ch; //将输入值赋值给T
CreateTree(T->lchild); //递归创建左子树
CreateTree(T->rchild); //递归创建右子树
}
}
——————————————————————————————————————————————————
//先遍历输出
void PreOrder(BiTree T){
if(T != NULL){
cout<data<<" “; //递归打印当前节点
PreOrder(T->lchild); //递归输出左子树
PreOrder(T->rchild); //递归输出右子树
}
}
——————————————————————————————————————————————————
void ChangeSonNode(BiTree &T){
BiTNode *t;
if( T != NULL ){
ChangeSonNode(T->lchild);
ChangeSonNode(T->rchild);
if (T->lchild != NULL && T->rchild != NULL){
t = T->lchild;
T->lchild = T->rchild;
T->rchild = t;
}
}
}
——————————————————————————————————————————————————
int main(){
BiTree T;
cout<<”\n请输入字符!(若输入的是#代表建立的是一棵空树):“;
CreateTree(T);
cout<<”\n先序遍历输出二叉链表:“; //A B C # # D E # # G # # F # # #
//ABC##DE##G##F###
PreOrder(T);
ChangeSonNode(T);
cout<<”\n\n交换左右孩子之后先序遍历输出二叉链表:";
PreOrder(T);
}
——————————————————————————————————————————————————

3、核心算法实现

——————————————————————————————————————————————————
#include<string.h>
#include<stdio.h>
#define MaxSize 20
#include
#include<stdlib.h>
#include “queue”
#define endl ‘\n’
using namespace std;
typedef struct BiTNode{ //结点
char data; //数据域
struct BiTNode *lchild,*rchild; //指针域
}BiTNode,*BiTree;
——————————————————————————————————————————————————
//先序遍历的顺序建立二叉链表
void CreateTree(BiTree &T){
char ch;
cin>>ch;
if (ch == ‘#’) T = NULL; //递归结束,建立空树
else{
T = new BiTNode; //申请一个结点
T->data = ch; //将输入值赋值给T
CreateTree(T->lchild); //递归创建左子树
CreateTree(T->rchild); //递归创建右子树
}
}
——————————————————————————————————————————————————
//先遍历输出
void PreOrder(BiTree T){
if(T != NULL){
cout<data<<" “; //递归打印当前节点
PreOrder(T->lchild); //递归输出左子树
PreOrder(T->rchild); //递归输出右子树
}
}
——————————————————————————————————————————————————
void ChangeSonNode(BiTree &T){
BiTNode *t;
if( T != NULL ){
ChangeSonNode(T->lchild);
ChangeSonNode(T->rchild);
if (T->lchild != NULL && T->rchild != NULL){
t = T->lchild;
T->lchild = T->rchild;
T->rchild = t;
}
if (T->lchild != NULL && T->rchild == NULL)
T->rchild = T->lchild;
if (T->lchild == NULL && T->rchild != NULL)
T->rchild = T->rchild;
}
}
——————————————————————————————————————————————————
int main(){
BiTree T;
cout<<”\n请输入字符!(若输入的是#代表建立的是一棵空树):“;
CreateTree(T);
cout<<”\n先序遍历输出二叉链表:“; //A B C # # D E # # G # # F # # #
//ABC##DE##G##F###
PreOrder(T);
ChangeSonNode(T);
cout<<”\n\n交换左右孩子之后先序遍历输出二叉链表:";
PreOrder(T);
}
——————————————————————————————————————————————————

在这里插入图片描述

4、算法分析

该算法实现最简单的是采用后序遍历递归实现!要想采用递归实现,必须深刻理解递归调用栈,只有这样才能写出符合题目的二叉树算法!注意二叉树交换左右孩子之后整个树的结构会发生变化,也即树的形状会发生变化,但是高度不变!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Q渡劫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值