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