/*
*二叉树基本操作 范例
*/
//需要的头文件
#include <stdio.h>
#include <stdlib.h>
//节点的结构类型
typedef struct BiNode{
int data;
struct BiNode * Lchild;//左孩子
struct BiNode * Rchild;//右孩子
}BiNode,*BiTree;
/*创建一个空的二叉树
*创建成功返回节点指针,否则返回空
*/
int init(BiTree &T){
if(T=(BiNode *)malloc(sizeof(BiNode))){
T->Lchild=NULL;
T->Rchild=NULL;
return 1;
}else{
return 0;
}
}
/*
*销毁二叉树
*/
void Destory(BiTree &T){
if(T){
Destory(T->Lchild);
Destory(T->Rchild);
free(T);
T=NULL;
}
}
/*删除某节点左子树,已知二叉树及节点pt*/
void DeleteL(BiTree &T,BiTree pt){
if(pt==NULL||pt->Lchild==NULL)
return;
Destory(pt->Lchild);
pt->Lchild=NULL;
}
/*删除某节点右子树,已知二叉树及节点pt*/
void DeleteR(BiTree &T,BiTree pt){
if(pt==NULL||pt->Lchild==NULL)
return;
Destory(pt->Rchild);
pt->Lchild=NULL;
}
void InsertL(BiTree &T,int e,BiTree pt){
BiTree p;
//该节点存在的情况下
if(pt){
if(p=(BiNode *)malloc(sizeof(BiNode))){
p->data=e;
p->Lchild=pt->Lchild;
p->Rchild=pt->Rchild;
pt->Lchild=p;//最后把将pt的左孩子变成p
}
}
}
void InsertR(BiTree &T,int e,BiTree pt){
BiTree p;
//该节点存在的情况下
if(pt){
if(p=(BiNode *)malloc(sizeof(BiNode))){
p->data=e;
p->Lchild=pt->Lchild;
p->Rchild=pt->Rchild;
pt->Rchild=p;//最后把将pt的右孩子变成p
}
}
}
/*
*二叉树遍历
*先序,中序,后序
*/
//先序
void Preorder(BiTree T){
if(T){
printf("%d",T->data);
Preorder(T->Lchild);
Preorder(T->Rchild);
}
}
//中序
void Inorder(BiTree T){
if(T){
Inorder(T->Lchild);
printf("%d",T->data);
Inorder(T->Rchild);
}
}
//后序
void Postorder(BiTree T){
if(T){
Postorder(T->Lchild);
Postorder(T->Rchild);
printf("%d",T->data);
}
}
*二叉树基本操作 范例
*/
//需要的头文件
#include <stdio.h>
#include <stdlib.h>
//节点的结构类型
typedef struct BiNode{
int data;
struct BiNode * Lchild;//左孩子
struct BiNode * Rchild;//右孩子
}BiNode,*BiTree;
/*创建一个空的二叉树
*创建成功返回节点指针,否则返回空
*/
int init(BiTree &T){
if(T=(BiNode *)malloc(sizeof(BiNode))){
T->Lchild=NULL;
T->Rchild=NULL;
return 1;
}else{
return 0;
}
}
/*
*销毁二叉树
*/
void Destory(BiTree &T){
if(T){
Destory(T->Lchild);
Destory(T->Rchild);
free(T);
T=NULL;
}
}
/*删除某节点左子树,已知二叉树及节点pt*/
void DeleteL(BiTree &T,BiTree pt){
if(pt==NULL||pt->Lchild==NULL)
return;
Destory(pt->Lchild);
pt->Lchild=NULL;
}
/*删除某节点右子树,已知二叉树及节点pt*/
void DeleteR(BiTree &T,BiTree pt){
if(pt==NULL||pt->Lchild==NULL)
return;
Destory(pt->Rchild);
pt->Lchild=NULL;
}
void InsertL(BiTree &T,int e,BiTree pt){
BiTree p;
//该节点存在的情况下
if(pt){
if(p=(BiNode *)malloc(sizeof(BiNode))){
p->data=e;
p->Lchild=pt->Lchild;
p->Rchild=pt->Rchild;
pt->Lchild=p;//最后把将pt的左孩子变成p
}
}
}
void InsertR(BiTree &T,int e,BiTree pt){
BiTree p;
//该节点存在的情况下
if(pt){
if(p=(BiNode *)malloc(sizeof(BiNode))){
p->data=e;
p->Lchild=pt->Lchild;
p->Rchild=pt->Rchild;
pt->Rchild=p;//最后把将pt的右孩子变成p
}
}
}
/*
*二叉树遍历
*先序,中序,后序
*/
//先序
void Preorder(BiTree T){
if(T){
printf("%d",T->data);
Preorder(T->Lchild);
Preorder(T->Rchild);
}
}
//中序
void Inorder(BiTree T){
if(T){
Inorder(T->Lchild);
printf("%d",T->data);
Inorder(T->Rchild);
}
}
//后序
void Postorder(BiTree T){
if(T){
Postorder(T->Lchild);
Postorder(T->Rchild);
printf("%d",T->data);
}
}