当前位置:文档之家› 二叉树的基本操作及实现.cpp

二叉树的基本操作及实现.cpp

二叉树的基本操作及实现二叉树的基本操作及实现的代码如下:#include <iostream.h>#define MAXNODE 100typedef char DataType;typedef struct BiTNode{DataType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;void Visit(DataType bt){ //输出二叉树结点值cout<<bt<<" ";}BiTree Initiate(){ //初始化二叉树BiTNode *bt=new BiTNode;if(!bt)return NULL;bt->lchild=NULL;bt->rchild=NULL;return bt;}BiTree Create_BiTree(DataType x,BiTree lbt,BiTree rbt){//建立二叉树:以结点值为x的结点为头结点,并以lbt和rbt为左右子树BiTree p;p=new BiTNode;if(!p){cout<<"无法完成二叉树的建立!"<<endl;return NULL;}p->data=x;p->lchild=lbt;p->rchild=rbt;return p;}BiTree InsertL(BiTree bt,DataType x,BiTree parent){ //在某结点之后插入左结点BiTree p;if(parent==NULL){cout<<"要插入结点的父节点不存在!"<<endl;return NULL;}p=new BiTNode;if(!p){cout<<"没有存储空间!"<<endl;return NULL;}p->data=x;p->lchild=NULL;p->rchild=NULL;if(parent->lchild==NULL)parent->lchild=p;else{p->lchild=parent->lchild;parent->lchild=p;}return bt;}BiTree DeleteL(BiTree bt,BiTree parent){ //删除左子树BiTree p;if(parent==NULL||parent->lchild==NULL){cout<<"参数有误,不能完成删除操作!"<<endl;return NULL;}p=parent->lchild;parent->lchild=NULL;delete p;return bt;}void PreOrder(BiTree bt){ //递归前序遍历二叉树if(bt==NULL)return;Visit(bt->data);PreOrder(bt->lchild);PreOrder(bt->rchild);}void InOrder(BiTree bt){ //递归中序遍历二叉树if(bt==NULL)return;InOrder(bt->lchild);Visit(bt->data);InOrder(bt->rchild);}void PostOrder(BiTree bt){ //递归后序遍历二叉树if(bt==NULL)return;PostOrder(bt->lchild);PostOrder(bt->rchild);Visit(bt->data);}void LevelOrder(BiTree bt){ //层次遍历二叉树BiTree Queue[MAXNODE];int front,rear;if(bt==NULL)return;front=-1;rear=0;Queue[rear]=bt;while(rear!=front){front++;Visit(Queue[front]->data);if(Queue[front]->lchild!=NULL){rear++;Queue[rear]=Queue[front]->lchild;}if(Queue[front]->rchild!=NULL){rear++;Queue[rear]=Queue[front]->rchild;}}}void NPRreOrder(BiTree bt){ //非递归先序遍历二叉树BiTree stack[MAXNODE],p;int top=-1;if(bt==NULL){cout<<"原二叉树为空!"<<endl;return;}p=bt;while(!(p==NULL&&top==-1)){while(p!=NULL){Visit(p->data);if(top<MAXNODE-1){top++;stack[top]=p;}else{cout<<"栈的空间不够无法完成遍历操作!"<<endl;return;}p=p->lchild;}if(top==-1)return;else{p=stack[top];top--;p=p->rchild;}}}void NPInOrder(BiTree bt){ //非递归中序遍历二叉树BiTree stack[MAXNODE],p;int top=-1;if(bt==NULL){cout<<"原二叉树为空!"<<endl;return;}p=bt;while(!(p==NULL&&top==-1)){while(p!=NULL){if(top<MAXNODE-1){top++;stack[top]=p;}else{cout<<"栈的空间不够无法完成遍历操作!"<<endl;return;}p=p->lchild;}if(top==-1)return;else{p=stack[top];top--;Visit(p->data);p=p->rchild;}}}typedef struct{ //非递归后序遍历二叉树BiTree link;int flag;}StackType;void NPPostOrder(BiTree bt){StackType stack[MAXNODE];BiTree p;int top,sign;if(bt==NULL){cout<<"原二叉树为空!"<<endl;return;}top=-1;p=bt;while(!(p==NULL&&top==-1)){if(p!=NULL){top++;stack[top].link=p;stack[top].flag=1;p=p->lchild;}else{p=stack[top].link;sign=stack[top].flag;top--;if(sign==1){top++;stack[top].link=p;stack[top].flag=2;p=p->rchild;}else{Visit(p->data);p=NULL;}}}}int CountLeaf(BiTree bt){ //统计叶结点个数if(bt==NULL)return 0;if(bt->lchild==NULL&&bt->rchild==NULL)return 1;return (CountLeaf(bt->lchild)+CountLeaf(bt->rchild)); }void main(){BiTNode *bta,*btb,*btc,*btd,*btf,*btg;DataType xa,xe;int count;bta=Initiate();btb=Initiate();;btc=Initiate();;btd=Initiate();;btf=Initiate();;btg=Initiate();;bta->lchild=bta->rchild=NULL;btb->data='B';btd->data='D';btg->data='G';btc->data='C';btf->data='F';btb->lchild=btd;btb->rchild=NULL;btd->lchild=NULL;btd->rchild=btg;btg->lchild=NULL;btg->rchild=NULL;btc->lchild=NULL;btc->rchild=btf;btf->lchild=NULL;btf->lchild=NULL;xa='A';xe='E';bta=Create_BiTree(xa,btb,btc);PreOrder(bta);cout<<endl;InOrder(bta);cout<<endl;PostOrder(bta);cout<<endl;LevelOrder(bta);cout<<endl;InsertL(bta,xe,btc);PreOrder(bta);cout<<endl;DeleteL(bta,btc);PreOrder(bta);cout<<endl;NPRreOrder(bta);cout<<endl;NPInOrder(bta);cout<<endl;NPPostOrder(bta);count=CountLeaf(bta);cout<<endl;cout<<"二叉树的叶子结点个数是:"<<count<<endl;}。

相关主题