二叉树的建立与前中后序遍历
#include"iostream.h"
struct BinTreeNode{
char data;
BinTreeNode *leftChild,*rightChild;
BinTreeNode(){leftChild=NULL,rightChild=NULL;}
BinTreeNode(char x ){data=x;}
BinTreeNode(char x ,BinTreeNode *l,BinTreeNode *r){data=x;leftChild=l,rightChild=r;}
};
class BinaryTree{
public:
BinaryTree(){root=NULL;RefValue='#';}
BinaryTree(char value){RefValue=value;root=NULL;}
void CreateBinTree(BinTreeNode *&BT);//创建二叉树
int Height(BinTreeNode *&BT);//计算树的深度
int Size(BinTreeNode *&BT);//计算树 的结点数
void PreOrder(BinTreeNode *&BT);//前序遍历
void InOrder(BinTreeNode *&BT);//中序遍历
void PostOrder(BinTreeNode *&BT);//后序遍历
void Print(BinTreeNode *&BT);//以广义表的形式输出二叉树
public:
BinTreeNode *root;
char RefValue;
//int count;//用来计算二叉树的结点数
};
void BinaryTree:: CreateBinTree(BinTreeNode *&BT)
{//创建二叉树
char ch;
cin>>ch;
if(ch!=RefValue){
BT=new BinTreeNode(ch);
CreateBinTree(BT->leftChild);
CreateBinTree(BT->rightChild);
}
else BT=NULL;
}
void BinaryTree::InOrder(BinTreeNode *&BT){//中序遍历
//count=0;
if(BT!=NULL){
InOrder(BT->leftChild);
cout<<BT->data;//++count;//逐个输出二叉树 顺便计算出其结点数
InOrder(BT->rightChild);
}
}
void BinaryTree::PreOrder(BinTreeNode *&BT){//前序遍历
if(BT!=NULL){
cout<<BT->data;
PreOrder(BT->leftChild);
PreOrder(BT->rightChild);
}
}
void BinaryTree::PostOrder(BinTreeNode *&BT){//后序遍历
if(BT!=NULL){
PostOrder(BT->leftChild);
PostOrder(BT->rightChild);
cout<<BT->data;
}
}
int BinaryTree:: Size(BinTreeNode *&BT){
if(BT==NULL) return 0;
else
return Size(BT->leftChild)+Size(BT->rightChild)+1;
}
int BinaryTree::Height(BinTreeNode *&BT){
if(BT==NULL) return 0;//对于空树,返回0并结束递归
int dep1=Height(BT->leftChild);
int dep2=Height(BT->rightChild);
return (dep1>dep2)?dep1+1:dep2+1;
}
void BinaryTree::Print(BinTreeNode *&BT){
if(BT!=NULL){
cout<<BT->data;//输出根结点的值
if(BT->leftChild!=NULL || BT->rightChild!=NULL){
cout<<'('; //输出左括号
Print(BT->leftChild);//输出左子树
if(BT->rightChild!=NULL)
cout<<',';//若右子树不为空则输出逗号分隔符
Print(BT->rightChild);//输出右子树
cout<<')';//输出右括号
}
}
}
void main(){
BinaryTree Tree;//定义对象Tree
cout<<"请输入二叉树:";
Tree.CreateBinTree(Tree.root);//创建二叉树
cout<<"前序遍历输出:";
Tree.PreOrder(Tree.root);cout<<endl;//前序遍历输出二叉树
cout<<"中序遍历输出:";
Tree.InOrder(Tree.root);cout<<endl;//中序遍历输出二叉树
cout<<"后序遍历输出:";
Tree.PostOrder(Tree.root);cout<<endl;//后序遍历输出二叉树
cout<<"树的深度:";
cout<<Tree.Height(Tree.root)<<endl;//计算树的深度
cout<<"树的结点数:";
cout<<Tree.Size(Tree.root)<<endl;//计算树 的结点数
cout<<"树的广义表输出:";
Tree.Print(Tree.root);cout<<endl;//以广义表的形式输出二叉树
}