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

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

#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

添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值