二叉树的前序,中序,后续遍历

匿名 (未验证) 提交于 2019-12-02 23:32:01

看了一篇有关这方面的博客,于是就运行了一下上面的代码.

#include<iostream> #include<algorithm> #include<string> using namespace std; typedef struct node{ char data; struct node *lc,*rc;//左右孩子 }*TBT,TBTNode; void createTBT(TBT &T){ 	char ch; 	cin>>ch; 	if(ch==' ')//如果输入位空字符,表示这个子树的结束 { 		T=NULL; 		return ; } T=(TBT)malloc(sizeof(TBTNode)); T->data=ch; createTBT(T->lc); createTBT(T->rc); } void preOrderTraverse(TBT T)//先序遍历 { if(!T) return ; cout<<T->data; preOrderTraverse(T->lc); preOrderTraverse(T->rc); } void inOrderTraverse(TBT T)//中序遍历 { if(!T) return; inOrderTraverse(T->lc); cout<<T->data; inOrderTraverse(T->rc); } void postOrderTraverse(TBT T)//后序遍历 { if(!T) return; postOrderTraverse(T->lc); postOrderTraverse(T->rc); cout<<T->data; } int elemNum(TBT T)//统计字节数 { if(T==NULL) return 0; return 1+elemNum(T->lc)+elemNum(T->rc); } int depth(TBT T)//树的深度 { if(T==NULL) return 0; return max(depth(T->lc)+1,depth(T->rc)+1); } int leafNum(TBT T)//叶子数 { if(T==NULL) return 0; if(T->lc==NULL&&T->rc==NULL) return 1; return leafNum(T->lc)+leafNum(T->rc); } void destoryTBT(TBT &T)//销毁遍历二叉树 { if(T==NULL) return ; destoryTBT(T->lc); destoryTBT(T->rc); free(T); T=NULL; } int main(){ TBT T; cout<<"Enter the tree :"<<endl; createTBT(T); cout<<"Succeed:"<<endl; cout<<"Elem num :"<<elemNum(T)<<endl; cout<<"Tree depth:"<<depth(T)<<endl; cout<<"Leaf num:"<<leafNum(T)<<endl; cout<<endl<<"PreOrder: "; preOrderTraverse(T); cout<<endl<<"inOrder: "; inOrderTraverse(T); cout<<endl<<"postOrder: "; postOrderTraverse(T); cout<<endl; destoryTBT(T); if(T==NULL) cout<<"Tree destoryed: "<<endl; return 0; }    

下面介绍另外一种排序方法

#include<iostream> #include<stack> #include<queue> #include<stdio.h> #include<stdlib.h> using namespace std; //二叉树的结点 typedef struct BiTNode{ //数据 char data; //左右孩子指针 struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //按照先序序列创建二叉树 int CreateBiTree(BiTree &T){ char data; //按照先序次序输入二叉树中结点的值(一个字符),'#'表示空树 scanf("%c",&data); if(data=='#'){ 	T=NULL; }else{ 	T=(BiTree)malloc(sizeof(BiTNode)); //生成根结点 T->data=data; //构造左子树 CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return 0; } //输出 void Visit(BiTree T){  if(T->data!='#'){ 	printf("%c",T->data); } } //先序遍历 void PreOrder(BiTree T){ 	if(T!=NULL){ //访问根节点 Visit(T); //访问左子结点 PreOrder(T->lchild); //访问右子结点 PreOrder(T->rchild); } } //中序遍历 void InOrder(BiTree T){ if(T!=NULL){ //访问左子结点 InOrder(T->lchild); //访问根结点 Visit(T); //访问右子结点 InOrder(T->rchild); } } //后序遍历 void PostOrder(BiTree T){ if(T!=NULL){ //访问左子结点 PostOrder(T->lchild); //访问右子结点 PostOrder(T->rchild); //访问根结点 Visit(T); } } //层序遍历 void LevelOrder(BiTree T){ BiTree p=T; //队列 queue<BiTree>queue; //根结点入队 queue.push(p); //队列不空循环 while(!queue.empty()){ //队头元素出队 p=queue.front(); //访问p指向的结点 printf("%c",p->data); //退出队列 queue.pop(); if(p->lchild!=NULL){ 	queue.push(p->lchild); } //右子树不空,将右子树入队 if(p->rchild!=NULL){ queue.push(p->rchild); } } } int main(){ BiTree T; CreateBiTree(T); printf("先序遍历:\n"); PreOrder(T); printf("中序遍历:"); InOrder(T); printf("后续遍历:\n"); PostOrder(T); printf("层次遍历:\n"); LevelOrder(T); return 0; }  

运行了其中的代码 ,讲的很清楚.

IPcom@ubuntu:~/DATASTRUCTURE$ ./app8 ABE##F##CG### 先序遍历: ABEFCG中序遍历:EBFAGC后续遍历: EFBGCA层次遍历: ABCEFG 

添加链接描述

文章来源: https://blog.csdn.net/Zyong139064359/article/details/89790795
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!