这里采用的是链式存储,每个结点包含三个属性(指向左右孩子的指针和本结点的数据),如果想了解顺序存储二叉树,可以参考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