一、二叉树的遍历:
1、前序遍历:根左右
2、中序遍历:左根右
3、后序遍历:左右根
4、层次遍历:一层一层的遍历,类似广度优先
二、二叉树的存储结构
二叉树以二叉链表结构存储,也就是1个数据域,两个指针域(分别指向左右孩子)
//二叉树的二叉链表结构定义 typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;
二叉树的建立,先按照前序遍历的方式建立二叉树,当然也可以按照中序遍历或者后序遍历的方式建立二叉树
//以前序遍历的方式建立二叉树 void CreateBiTree(BiTree *T) { ElemType ch; cin>>ch; if(ch=='#') { *T=NULL; } else { *T=(BiTNode)malloc(sizeof(BiTNode)); if(!*T) { exit(OVERFLOW);//分配内存失败退出 } else { (*T)->data=ch;//生成结点 CreateBiTree(&(*T)->lchild);//构造左子树 CreateBiTree(&(*T)->rchild);//构造右子树 } } }
递归前序遍历二叉树
//递归方式前序遍历二叉树 void PreOrderTraverse(BiTree T,int level) { if(T==NULL) { return; } else { Display(T->data); Floor(T->data,level);//输出了层数 PreOrderTraverse(T->lchild,level+1); PreOrderTraverse(T->rchild,level+1); } }
递归中序遍历二叉树
//递归中序遍历 void InOrderTraverse(BiTree T,int level) { if(T==NULL) { return; } else { InOrderTraverse(T->lchild,level+1); Display(T->data); Floor(T->data,level); InOrderTraverse(T->rchild,level+1); } }
递归后序遍历二叉树
//递归后序遍历 void PostOrderTraverse(BiTree T,int level) { if(T==NULL) { return; } else { PostOrderTraverse(T->lchild,level+1); PostOrderTraverse(T->rchild,level+1); Display(T->data); Floor(T->data,level); } }
完整代码如下:
#include<iostream> #include<stdlib.h> using namespace std; typedef char ElemType; //二叉树的二叉链表结构,也就是二叉树的存储结构,1个数据域,2个指针域(分别指向左右子结点) typedef struct BiTNode { ElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //以前序遍历的方式建立二叉树 void CreateBiTree(BiTree *T) { ElemType ch; cin>>ch; if(ch=='#') { *T=NULL; } else { *T=(BiTNode)malloc(sizeof(BiTNode)); if(!*T) { exit(OVERFLOW);//分配内存失败退出 } else { (*T)->data=ch;//生成结点 CreateBiTree(&(*T)->lchild);//构造左子树 CreateBiTree(&(*T)->rchild);//构造右子树 } } } //将二叉树前序遍历输出 void Display(ElemType ch) { cout<<ch<<" "; } //在输出的基础上,输出层数 void Floor(ElemType ch,int level) { cout<<ch<<"在第"<<level<<"层"<<end; } //递归方式前序遍历二叉树 void PreOrderTraverse(BiTree T,int level) { if(T==NULL) { return; } else { Display(T->data); Floor(T->data,level);//输出了层数 PreOrderTraverse(T->lchild,level+1); PreOrderTraverse(T->rchild,level+1); } } //递归中序遍历 void InOrderTraverse(BiTree T,int level) { if(T==NULL) { return; } else { InOrderTraverse(T->lchild,level+1); Display(T->data); Floor(T->data,level); InOrderTraverse(T->rchild,level+1); } } //递归后序遍历 void PostOrderTraverse(BiTree T,int level) { if(T==NULL) { return; } else { PostOrderTraverse(T->lchild,level+1); PostOrderTraverse(T->rchild,level+1); Display(T->data); Floor(T->data,level); } } int main() { int level=1;//表示层数 BiTree T=NULL; cout<<"请以前序遍历的方式输入二叉树:";//类似输入AB#D##C## CreateBiTree(&T);//建立二叉树,没有树,无法遍历 cout<<"递归前序遍历输出:"<<endl; PostOrderTraverse(T,level); cout<<end; cout<<"递归中序遍历输出为:"<<end; InOrderTraverse(T,level); cout<<endl; cout<<"递归后序遍历输出为:"<<endl; PostOrderTraverse(T,level); cout<<endl; return 0; }
by author:Foreordination
2018-02-06 17:06:22