基于递归调用和链式结构的二叉树构建方法及其基本运算

今天给大家带来的存储结构中最经典的二叉树构建法以及他的先序后序遍历方法,数结点和递归调用是构建二叉树的核心,下面直接给出二叉树的构建代码,这里丰富的注释有助您更好的掌握这类思想和方法应用:

//超超
//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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值