实验内容:
1.输入字符序列,建立二叉链表。
2.前序,中序,后序遍历二叉树:递归算法。
3.中序遍历二叉树:非递归算法。
4.求二叉树的高度 。
5.求二叉树的叶子个数。
6.借助队列实现二叉树的层次遍历。
7.在主函数中设计一个简单的菜单,分别调试上述算法。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include<string.h> #include<algorithm> #include<math.h> #include<queue> #include<stack> using namespace std; typedef long long ll; struct binode { char data; binode *l,*r; }; binode *create(binode *T)///建树 { char x; cin>>x; if(x=='@')T=NULL; else { T=(binode*)malloc(sizeof(binode)); T->data=x; T->l=create(T->l); T->r=create(T->r); } return T; } void postorder( binode *T )///递归实现后序遍历 { if ( T != NULL ) { postorder ( T->l); postorder ( T->r); printf("%c ",T->data); } } void preorder(binode *T)///递归实现前序遍历 { if (T != NULL) { printf("%c ",T->data); preorder ( T->l); preorder ( T->r); } } void midorder( binode * T )///递归实现中序遍历 { if ( T != NULL ) { midorder ( T->l); printf("%c ",T->data); midorder ( T->r); } } void mid(binode *T)///非递归实现中序遍历 { stack<binode*>s; binode *p=T; while(p||!s.empty()) { if(p) { s.push(p); p=p->l; } else { p=s.top(); s.pop(); cout<<p->data<<' '; p=p->r; } } } int deep(binode*T)///求树的高度 { int s=1; if(T!=NULL) { int max0=0; if(T->l!=NULL) max0=max(max0,deep(T->l)); if(T->r!=NULL) max0=max(max0,deep(T->r)); s+=max0; } return s; } int yezi(binode*T)///求叶子树 { int s=0; if(T->l!=NULL) s+=yezi(T->l); if(T->r!=NULL) s+=yezi(T->r); if(T->l==NULL&&T->r==NULL) s=1; return s; } queue<binode*>q; void cengcibianli(binode*T)///队列实现层次遍历 { if(T!=NULL) { if(T->l!=NULL) q.push(T->l); if(T->r!=NULL) q.push(T->r); cengcibianli(T->l); cengcibianli(T->r); } } int main() { binode *a=NULL; a=create(a); cout<<"递归实现中序遍历:"<<endl; midorder(a); cout<<endl; cout<<"递归实现后序遍历:"<<endl; postorder(a); cout<<endl; cout<<"递归实现前序遍历:"<<endl; preorder(a); cout<<endl; cout<<"非递归实现中序遍历"<<endl; mid(a); cout<<endl; cout<<"树的高度为:"<<endl; cout<<deep(a)<<endl; cout<<"树的叶子数为:"<<endl; cout<<yezi(a)<<endl; cout<<"树的层次遍历:"<<endl; q.push(a); cengcibianli(a); while(!q.empty()) cout<<q.front()->data<<' ',q.pop(); return 0; }