看了一篇有关这方面的博客,于是就运行了一下上面的代码.
#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