【数据结构】二叉树的定义,递归遍历,非递归遍历,层次遍历,深度等

来源:互联网 发布:影楼一键修图软件 编辑:程序博客网 时间:2024/05/18 02:32
#include<iostream>using namespace std;typedef char Elemtype;struct BiNode{Elemtype date;BiNode *lchild,*rchild;};typedef BiNode *Bitree;//树的初始化 void Inittree(Bitree &bt){bt=NULL;}//树的先序创建void Create(Bitree &bt){//abc##d##ef##g##Elemtype d;cin>>d;if(d=='#') bt=NULL;else{bt=new BiNode;bt->date=d;Create(bt->lchild);Create(bt->rchild);}} //递归 //树的先序遍历void preOrder(Bitree &bt){if(bt){cout<<bt->date<<" ";preOrder(bt->lchild);preOrder(bt->rchild);}} //树的中序遍历 void inOrder(Bitree &bt){if(bt){inOrder(bt->lchild);cout<<bt->date<<" ";inOrder(bt->rchild);}}//树的后序遍历  void postOrder(Bitree &bt){if(bt){postOrder(bt->lchild);postOrder(bt->rchild);cout<<bt->date<<" ";}} //非递归 //非递归先序遍历void preIterOrder(Bitree &bt){BiNode* s[100]; //栈sint top=-1;  //空栈BiNode *p=bt;while(p||top!=-1){while(p){s[++top]=p; //入栈cout<<p->date<<" ";p=p->lchild; }p=s[top--]; //出栈 p=p->rchild;} } //非递归中序遍历void inIterOrder(Bitree &bt){BiNode* s[100]; //栈sint top=-1;  //空栈BiNode *p=bt;while(p||top!=-1){while(p){s[++top]=p; //入栈p=p->lchild; }p=s[top--]; //出栈 cout<<p->date<<" ";p=p->rchild;} } //非递归后序遍历void postIterOrder(Bitree &bt){BiNode* s[100]; //栈sint top=-1;  //空栈BiNode *p=bt; BiNode *q=NULL; //q为当前访问过的节点,初始为空while(p||top!=-1){while(p){s[++top]=p;p=p->lchild;}p=s[top]; //取栈顶if(p->rchild==NULL||p->rchild==q){//如果p没有右孩子或者右孩子是q//表明以p为根的右子树已经遍历结束,此时可以访问根结点p了cout<<p->date<<" ";q=p; //q指向刚访问过的结点top--; //出栈 p=NULL;} else p=p->rchild;} } //二叉树的按层遍历算法void levelOrder(Bitree &bt){const int N=100; //队列空间大小BiNode *q[N];int front=0,rear=0;if(bt){q[rear]=bt;//树根入队rear=(rear+1)%N; } BiNode *p;while(front!=rear){p=q[front];front=(front+1)%N;//出队cout<<p->date<<" ";if(p->lchild) q[rear++]=p->lchild;//左孩子入队if(p->rchild) q[rear++]=p->rchild;//右孩子入队}} //输出带括号的中缀表达式void inOrder2(Bitree &bt){if(bt){if(bt->lchild&&bt->lchild->lchild&&bt->lchild->rchild) cout<<"("<<" ";inOrder(bt->lchild);if(bt->lchild&&bt->lchild->lchild&&bt->lchild->rchild) cout<<")"<<" ";cout<<bt->date<<" ";if(bt->rchild&&bt->rchild->lchild&&bt->rchild->rchild) cout<<"("<<" ";inOrder(bt->rchild);if(bt->rchild&&bt->rchild->lchild&&bt->rchild->rchild) cout<<")"<<" ";}}//求二叉树的深度int height(const Bitree &bt){int lh,rh;if(bt==NULL) return 0;lh=height(bt->lchild);rh=height(bt->rchild);return (lh>=rh?lh:rh)+1;} //求二叉树叶子个数int leafs(const Bitree &bt){if(bt==NULL) return 0;if(bt->lchild==NULL&&bt->rchild==NULL) return 1;return leafs(bt->lchild)+leafs(bt->rchild);} //打印叶子void Printleaf(const Bitree &bt){if(bt==NULL) return;if(bt->lchild==NULL&&bt->rchild==NULL) cout<<bt->date<<" ";Printleaf(bt->lchild);Printleaf(bt->rchild);} int main(){Bitree bt;Inittree(bt);Create(bt);cout<<"递归先序遍历二叉树:";preOrder(bt);cout<<endl;cout<<"递归中序遍历二叉树:";inOrder(bt);cout<<endl;cout<<"递归后序遍历二叉树:";postOrder(bt);cout<<endl;cout<<"递非归先序遍历二叉树:";preIterOrder(bt); cout<<endl;cout<<"非递归中序遍历二叉树:";inIterOrder(bt); cout<<endl;cout<<"非递归后序遍历二叉树:";postIterOrder(bt); cout<<endl;cout<<"按层遍历二叉树:"; levelOrder(bt);cout<<endl;cout<<"输出带括号的中缀表达式:";inOrder2(bt);cout<<endl;cout<<"输出二叉树高度:";cout<<height(bt);cout<<endl;cout<<"输出二叉树叶子个数:";cout<<leafs(bt);cout<<endl;cout<<"输出二叉树的叶子:";Printleaf(bt);cout<<endl;return 0;}

阅读全文
0 0
原创粉丝点击