最近学习树,相关实验代码感觉可以优化,希望指正。
实验要求:
//遍历构造二叉树
//链式二叉树
//1.建立一棵结点元素类型为char类型的二叉树。
//要求实现计算二叉树的叶子节点个数、计算总结点个数、
//计算二叉树的高度等算法;实现先序、中序、后续遍历,
//打印出遍历顺序。在主函数中设计一个简单的菜单,分别调试上述算法。
二叉树结构体定义:
typedef struct Binarytree{
char data;
Binarytree *left;
Binarytree *right;
}*Btree,Bnode;
构造二叉树:
//先序遍历构造二叉树 ,例如构造树 A
// 要输入数据:ABD##E##CF##G## / \
// B C
// / \ / \
// D E F G
void creatBtree(Btree &b){
char ch;
cout<<"输入结点数据(空结点以#代替)"<<endl;
cin>>ch;
if(ch=='#'){
b=NULL;
}
else
{
Btree b1=(Btree)malloc(sizeof(Bnode));
b1->data=ch;
b=b1;
creatBtree(b1->left);
creatBtree(b1->right);
}
}
遍历算法:
int trvBtree1(Btree b){//中序遍历
int sum;
if(b==NULL)return 0;
trvBtree1(b->left);
cout<<b->data;
cout<<" ";
sum++;
trvBtree1(b->right);
}
int trvBtree2(Btree b){//后序遍历
if(b==NULL)return 0;
trvBtree1(b->left);
trvBtree1(b->right);
cout<<b->data;
cout<<" ";
}
int trvBtree3(Btree b){//先序遍历
if(b==NULL)return 0;
cout<<b->data;
cout<<" ";
trvBtree1(b->left);
trvBtree1(b->right);
}
节点数、叶子树、树的高度算法:
int countleaf(Btree b){//叶子数
if(!b)
return 0; //空树,无叶子
else if(!b->left&&!b->right)
return 1;
else
return (countleaf(b->left)+countleaf(b->right));
}
int counthight(Btree b){//高度
if(!b)return 0;//空树
else if(!b->left&&!b->right)
return 1;
else
return 1+max(count(b->left),count(b->right));
}
int countnode(Btree b){//结点数
if(!b){//空树
return 0;
} else{
if(!b->left&&!b->right)
return 1;
else
return 1+countnode(b->left)+countnode(b->right);
}
}
运行截图: