结构体——存储结点信息
struct BiNode{
char data;
BiNode *lchild;
BiNode *rchild;
};
类的声明
class Bitree{
public:
Bitree(){root=creat(root);}
~Bitree(){Release(root);}
void Preorder(){Preorder(root);}
void inorder(){inorder(root);}
void Postorder(){Postorder(root);}
void Leverorder(){Leverorder(root);}
private:
BiNode* creat(BiNode *bt);
void Release(BiNode *bt);
void Preorder(BiNode* bt);
void inorder(BiNode* bt);
void Postorder(BiNode* bt);
void Leverorder(BiNode* bt);
BiNode *root;
};
类的实现
构造函数
使用对象时,调用构造函数,进入creat函数。
Bitree(){root=creat(root);}
运行时,输入前序遍历序列建树,键盘缓冲区会存储输入的字串。
BiNode* Bitree::creat(BiNode *bt){
char ch;
cin>>ch;
if(ch=='#') bt=NULL;
else{
bt=new BiNode;
bt->data=ch;
bt->lchild=creat(bt->lchild);
bt->rchild=creat(bt->lchild);
}
return bt;
}
遍历
二叉树的基本操作都基于遍历。因此,遍历是二叉树的重点!
前中后序都应检查传入的节点是否为空,若已空,返回;若非空,按照顺序递归输出。
前序
void Bitree::Preorder(BiNode* bt){ //DLR
if(bt==NULL) return;
else {
cout<<bt->data;
Preorder(bt->lchild);
Preorder(bt->rchild);
}
}
中序
void Bitree::inorder(BiNode* bt){ //LDR
if(bt==NULL) return;
else {
inorder(bt->lchild);
cout<<bt->data;
inorder(bt->rchild);
}
}
后序
void Bitree::Postorder(BiNode* bt){ //LRD
if(bt==NULL) return;
else {
Postorder(bt->lchild);
Postorder(bt->rchild);
cout<<bt->data;
}
}
层序
使用队列暂存结点并实现输出。
void Bitree::Leverorder(BiNode* bt){ //层序遍历:一层一层输出(使用队列对父节点和孩子操作)
BiNode *Q[100],*q=NULL;
int front=-1,rear=-1;
if(root==NULL) return ; //空树,跳出创建
Q[++rear]=root; //当前结点先入队
while(front != rear){ //队空时,front=rear。
//队列非空进行下列操作,直到队列为空为止 :1.队首出队;2.当前结点左右孩子入队
q=Q[++front]; //当前结点出队
cout<<q->data<<" ";
if(q->lchild != NULL) Q[++rear]=q->lchild;
if(q->rchild != NULL) Q[++rear]=q->rchild;
}
}
析构函数
思路:依次释放左右孩子,最后释放根节点
void Bitree::Release(BiNode *bt){
if(bt==NULL) return;
else{
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
完整源码
#include<iostream>
using namespace std;
struct BiNode{
char data;
BiNode *lchild;
BiNode *rchild;
};
class Bitree{
public:
Bitree(){root=creat(root);}
~Bitree(){Release(root);}
void Preorder(){Preorder(root);}
void inorder(){inorder(root);}
void Postorder(){Postorder(root);}
void Leverorder(){Leverorder(root);}
private:
BiNode* creat(BiNode *bt);
void Release(BiNode *bt);
void Preorder(BiNode* bt);
void inorder(BiNode* bt);
void Postorder(BiNode* bt);
void Leverorder(BiNode* bt);
BiNode *root;
};
BiNode* Bitree::creat(BiNode *bt){
//输入前序遍历序列建树
char ch;
cin>>ch;
if(ch=='#') bt=NULL;
else{
bt=new BiNode;
bt->data=ch;
bt->lchild=creat(bt->lchild);
bt->rchild=creat(bt->lchild);
}
return bt;
}
//前中后序遍历:检查传入的节点是否为空,若已空,返回;若非空,按照顺序递归输出
void Bitree::Preorder(BiNode* bt){ //DLR
if(bt==NULL) return;
else {
cout<<bt->data;
Preorder(bt->lchild);
Preorder(bt->rchild);
}
}
void Bitree::inorder(BiNode* bt){ //LDR
if(bt==NULL) return;
else {
inorder(bt->lchild);
cout<<bt->data;
inorder(bt->rchild);
}
}
void Bitree::Postorder(BiNode* bt){ //LRD
if(bt==NULL) return;
else {
Postorder(bt->lchild);
Postorder(bt->rchild);
cout<<bt->data;
}
}
void Bitree::Leverorder(BiNode* bt){ //层序遍历:一层一层输出(使用队列对父节点和孩子操作)
BiNode *Q[100],*q=NULL;
int front=-1,rear=-1;
if(root==NULL) return ; //空树,跳出创建
Q[++rear]=root; //当前结点先入队
while(front != rear){ //队空时,front=rear。
//队列非空进行下列操作,直到队列为空为止 :1.队首出队;2.当前结点左右孩子入队
q=Q[++front]; //当前结点出队
cout<<q->data<<" ";
if(q->lchild != NULL) Q[++rear]=q->lchild;
if(q->rchild != NULL) Q[++rear]=q->rchild;
}
}
void Bitree::Release(BiNode *bt){
//顺序与后序遍历相同:依次释放左右孩子,最后释放根节点
if(bt==NULL) return;
else{
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
int main(){
Bitree t;
cout<<"前序遍历:";
t.Preorder();cout<<endl;
cout<<"中序遍历:";
t.inorder();cout<<endl;
cout<<"后序遍历:";
t.Postorder();cout<<endl;
return 0;
}