二叉树分为三种遍历方式:
--这里说的序是针对根节点的。
1.先序遍历:根——左——右
2.中序遍历:左——根——右
3.后序遍历:左——右——根
//作为 kai1.h 头文件
#include<stdio.h>//输入输出流
#include<stdlib.h>//标准库
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}*bitree,bitnode;
//构造一个新的二叉树
bitree initbitree(bitnode *root)
{
bitree tree=root;
return tree;
}
//生成节点包含数据域和左右孩子
bitnode *makenode(char item, bitnode *lchild,bitnode *rchild)
{
bitnode *pnode=(bitnode*)malloc(sizeof(bitnode));
if(pnode)
{
pnode->data=item;
pnode->lchild=lchild;
pnode->rchild=rchild;
}
return pnode;
}
//释放节点
void freenode(bitnode *pnode)
{
if(pnode!=NULL)
free(pnode);
}
//销毁二叉树
void destorybitnode(bitree tree)
{
bitnode *pnode=tree;
if(pnode->lchild!=NULL)
{
destorybitnode(pnode->lchild);
}
if(pnode->rchild!=NULL)
{
destorybitnode(pnode->rchild);//递归调用
}
freenode(pnode);
}
//判断是否为空
int isempty(bitree tree)
{
if(tree==NULL)
return 0;
else
return 1;
}
//返回树的深度
int GetDepth(bitree tree)
{
int cd,ld,rd;
cd=ld=rd=0;
if(tree)
{
ld=GetDepth(tree->lchild);
rd=GetDepth(tree->rchild);
cd=(ld>rd?ld:rd);
return cd+1;
}
else
{
return 0;
}
}
//返回根
bitree get(bitree tree)
{
return tree;
}
//返回节点值
int getint(bitnode *pnode)
{
return pnode->data;
}
//设置节点值
void setint(bitnode *pnode, int item)
{
pnode->data=item;
}
//设置左子树
bitree setlchild(bitree parent,bitree lchild)
{
parent->lchild=lchild;
return lchild;
}
//设置右子树
bitree setrchild(bitree parent,bitree rchild)
{
parent->rchild=rchild;
return rchild;
}
//返回左子树
bitree getlchild(bitree tree)
{
if(tree!=NULL)
return tree->lchild;
else
return NULL;
}
//返回右子树
bitree getrchild(bitree tree)
{
if(tree!=NULL)
return tree->rchild;
else
return NULL;
}
//插入新的子树,lr为0插入左子树,为1插入右子树
bitree insertchild(bitree parent,int lr,bitree child)
{
if(parent)
{
if(lr==0&&parent->lchild==NULL)
{
parent->lchild=child;
return child;
}
if(lr==1&&parent->rchild==NULL)
{
parent->rchild=child;
return child;
}
}
}
//删除子树lr为0删除左子树,为1删除右子树
void deletechild(bitree parent,int lr)
{
if(parent)
{
if(lr=0 && parent->lchild!=NULL)
{
parent->lchild=NULL;
freenode(parent->lchild);//释放空间
}
if(lr=1 && parent->rchild!=NULL)
{
parent->rchild=NULL;
free(parent->rchild);
}
}
}
#include"kai1.h"
void preordertravers(bitnode *root)
{
if(root)
{
printf("%c ",root->data);
preordertravers(root->lchild);
preordertravers(root->rchild);
}
}
//中序遍历
void inordertravers(bitnode *root)
{
if(root)
{ inordertravers(root->lchild);
printf("%c ",root->data);
inordertravers(root->rchild);
}
}
//后序遍历
void postordertravers(bitnode *root)
{
if(root)
{
postordertravers(root->lchild);
postordertravers(root->rchild);
printf("%c ",root->data);
}
}
int main()
{
bitnode *G=makenode('G',NULL,NULL);
bitnode *H=makenode('H',NULL,NULL);
bitnode *I=makenode('I',NULL,NULL);
bitnode *J=makenode('J',NULL,NULL);
bitnode *D=makenode('D',NULL,G);
bitnode *E=makenode('E',H,I);
bitnode *F=makenode('F',NULL,J);
bitnode *B=makenode('B',D,E);
bitnode *C=makenode('C',F,NULL);
bitnode *A=makenode('A',B,C);
printf("先序遍历:");
preordertravers(A);//A是根节点
printf("\n");
printf("中序遍历:");
inordertravers(A);//A是根节点
printf("\n");
printf("后序遍历:");
postordertravers(A);//A是根节点
printf("\n");
return 0;
}