您的位置:首页 > 其它

二叉树的创建与遍历(链式存储)

2016-12-19 20:21 375 查看
这里采用的是链式存储,每个结点包含三个属性(指向左右孩子的指针和本结点的数据),如果想了解顺序存储二叉树,可以参考http://www.cnblogs.com/-beyond/p/6065189.html

采用先序递归创建二叉树,叶子的左右孩子链域为NULL



输入的顺序为:abd--e--c-f-- (-表示空一个空格)

#include<iostream>
#include<cstdio>
using namespace std;

struct BiTNode{
BiTNode *lchild,*rchild;
char data;
};
typedef BiTNode *BiTree;
const char Nil=' ';//默认值
const int maxn=100;

//初始化
void InitBiTree(BiTree &T){
T=NULL;
}

//销毁
void DestoryBiTree(BiTree &T){
if(T){//树不为空
if(T->lchild){//递归方法销毁左子树
DestoryBiTree(T->lchild);
}
if(T->rchild){//递归方法销毁右子树
DestoryBiTree(T->rchild);
}
delete(T);
T=NULL;
}
}

//此代码段没有调用
void Visit(char value){
cout<<value<<' ';
}

//先序递归遍历
void PreOrderTraverse(BiTree T){
if(T){
cout<<T->data<<' ';
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}

//中序递归遍历
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
cout<<T->data<<' ';
InOrderTraverse(T->rchild);
}
}

//后序递归遍历
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data<<' ';
}
}

//先序递归建立二叉树
void CreateBiTree(BiTree &T){
char ch;
scanf("%c",&ch);
if(ch==Nil){
T=NULL;
}
else {
T=new BiTNode;
if(!T){
cout<<"申请内存失败"<<endl;
}
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}

//判断二叉树是否为空
bool EmptyBiTree(BiTree T){
if(T){
return false;
}
return true;
}

//返回二叉树的深度
int BiTreeDepth(BiTree T){
int i,j;
if(!T){
return 0;
}
if(T->lchild){
i=BiTreeDepth(T->lchild);
}
else i=0;
if(T->rchild){
j=BiTreeDepth(T->rchild);
}
else j=0;
return 1+(i>j?i:j);
}

//返回根
char GetRoot(BiTree T){
if(EmptyBiTree(T)){
return Nil;
}
return T->data;
}

//返回结点的值
char GetValue(BiTree p){
return p->data;
}

//给节点赋值
char Assign(BiTree p,char value){
p->data=value;
}

int main(){
BiTree T;
InitBiTree(T);
CreateBiTree(T);

cout<<"先序遍历"<<endl;
PreOrderTraverse(T);

cout<<endl<<"中序遍历"<<endl;
InOrderTraverse(T);

cout<<endl<<"后序遍历"<<endl;
PostOrderTraverse(T);

cout<<endl<<"树的根为"<<endl;
cout<<GetRoot(T)<<endl;

cout<<"深度"<<endl;
cout<<BiTreeDepth(T)<<endl;
}


测试数据:

abd__e__c_f__

结果:



过程中有点小问题,很容易被忽略的:在创建二叉树的时候,输入单个字符的时候不要用cin,应该用scanf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: