今天给大家带来的存储结构中最经典的二叉树构建法以及他的先序后序遍历方法,数结点和递归调用是构建二叉树的核心,下面直接给出二叉树的构建代码,这里丰富的注释有助您更好的掌握这类思想和方法应用:
//超超
//2016 10 7
#include<iostream>
using namespace std;
typedef char elementtype;//二叉树存数据对象别名
typedef struct binarynode{
elementtype data;
struct binarynode *lchild;//定义左结点
struct binarynode *rchild;//定义右结点
}bnode;
//利用链式动态构建二叉树结构
class binary_tree{
public:
binary_tree();
// ~binary_tree();//动态链式结构需要析构函数来释放空间
void preorder();//先序遍历函数
void inorder();//中序遍历函数
void postorder();//后序遍历函数
void create_binary_tree();//建立一个二叉树
int high();//求二叉树高度
int num();//求二叉树结点数
private:
int i,n;
bnode *root;
void create_binary_tree(bnode *&t);//加二叉树结点函数
void visite(bnode *t);//访问结点函数
void preorder(bnode *t);//先序遍历结点函数
void inorder(bnode *t);//中序遍历结点函数
void postorder(bnode *t);//后序遍历结点函数
int high(bnode *t);
int num(bnode *t);
};
binary_tree::binary_tree(){
root=NULL;
i=1;
n=0;
}
void binary_tree::visite(bnode *t){
cout<<t->data;
}
//先序遍历算法(很简单,是递归调用)
void binary_tree::preorder(){
preorder(root);//将root结点为第一个参数,传给私有的先序遍历结点函数
}
void binary_tree::preorder(bnode *t){
if(t!=NULL){
visite(t);
preorder(t->lchild);
preorder(t->rchild);
}
}
//中序遍历算法(很简单,是递归调用)
void binary_tree::inorder(){
inorder(root);//将root结点为第一个参数,传给私有的中序遍历结点函数
}
void binary_tree::inorder(bnode *t){
if(t!=NULL){
inorder(t->lchild);//先左子树结点
visite(t);//然后根结点
inorder(t->rchild);//再右子树结点
}
}
//后序遍历算法(很简单,是递归调用)
void binary_tree::postorder(){
postorder(root);//将root结点为第一个参数,传给私有的中序遍历结点函数
}
void binary_tree::postorder(bnode *t){
if(t!=NULL){
postorder(t->lchild);//先左子树
postorder(t->rchild);//再右子树
visite(t);//再根节点
}
}
//建立一个二叉树,使用先序输入
void binary_tree::create_binary_tree(){
create_binary_tree(root);
}
void binary_tree::create_binary_tree(bnode *&t){
cout<<"提示:使用先序输入法输入二叉树数据!!!"<<endl;
char ch;
cout<<"请输入第"<<i++<<"个数: ";
cin>>ch;
if(ch=='#') t=NULL;//#表示结束
else{
t=new bnode;
t->data=ch;
create_binary_tree(t->lchild);
create_binary_tree(t->rchild);
}
}
//求二叉树的高度
int binary_tree::high(){
return high(root);
}
int binary_tree::high(bnode *t){
if(t==NULL) return 0;
else return (high(t->lchild)>high(t->rchild)?high(t->lchild):high(t->rchild))+1;
}
//求二叉树的叶子结点数
int binary_tree::num(){
return num(root);
}
int binary_tree::num(bnode *t){
if(t==NULL) return 0;
if(t->lchild==NULL&&t->rchild==NULL ) return 1;
else return num(t->lchild)+num(t->rchild );
}
int main(){
binary_tree bt;
cout<<"请输入扩展后二叉树的先序序列,用#表示空:";
bt.create_binary_tree();
cout<<"先序序列: "; bt.preorder(); cout<<endl;
cout<<"中序序列: "; bt.inorder(); cout<<endl;
cout<<"后序序列: "; bt.postorder(); cout<<endl;
cout<<"二叉树的高度为: "<<bt.high(); cout<<endl;
cout<<"叶子结点数为: "<<bt.num(); cout<<endl;
return 1;
}