结构体定义
//定义二叉树的结构
typedef char ElemType;
typedef struct BiTNode
{
ElemType data; //数据域
struct BiTNode* lchild, * rchild; //左右子树
} BiTNode, *BiTree; //节点、整颗树
先序创建二叉树
//先序创建二叉树
void CreateBiTree(BiTree *T){
char ch;
cin>>ch;
if(ch=='#') *T=NULL;
else{
*T=new BiTNode;
(*T)->data=ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
遍历
//先序遍历
void PreOrderTraverse(BiTree T){
if(T){
cout<data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
cout<data;
PreOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
cout<data;
}
}
打印树
//打印树
void PrintTree(BiTree T,int deep,string code){
//* @T 树的根节点
//* @deep 此节点的深度
//* @code 从根节点遍历到此处的路径码,向左用0表示,向右用1表示*/
if(T){
PrintTree(T->rchild,deep+1,code+"1");
for(int i=0;idata<<")"<lchild,deep+1,code+"0");
}
}
查找节点
//查找节点
BiTree FindNode(BiTree T,ElemType x){
BiTree tmp;
if(T==NULL) return NULL;
if(T->data==x) return T;
else{
tmp=FindNode(T->lchild,x);
if(tmp) return tmp;
tmp=FindNode(T->rchild,x);
if(tmp) return tmp;
}
}
插入节点(叶子)
//插入节点
void AddNode(BiTree *T,int direction,ElemType x){
if(direction==0){
if((*T)->lchild==NULL){
BiTNode *newNode=new BiTNode;
newNode->data=x;
newNode->lchild=NULL,newNode->rchild=NULL;
(*T)->lchild=newNode;
}else{
AddNode(&((*T)->lchild),direction,x);
}
}else if(direction==1){
if((*T)->rchild==NULL){
BiTNode *newNode=new BiTNode;
newNode->data=x;
newNode->lchild=NULL,newNode->rchild=NULL;
(*T)->rchild=newNode;
}else{
AddNode(&((*T)->rchild),direction,x);
}
}
}
树的深度
//树的深度
int Depth(BiTree T){
if(T==NULL) return 0;
else{
int i=Depth(T->lchild);
int j=Depth(T->rchild);
return i>j ? i+1 : j+1;
}
}
树的宽度
//求每一层的宽度
void LawyerWidth(BiTree T,int a[],int h){
if(T){
a[h]++;
LawyerWidth(T->lchild,a,h+1);
LawyerWidth(T->rchild,a,h+1);
}
}
//树的宽度
int Width(BiTree T){
int H=Depth(T); //总高度
int *a=new int[H+1];
for(int i=0;iwidth) width=a[i];
}
return width;
}
统计节点个数
//统计结点个数
int NodeCount(BiTree T){
if(T==NULL) return 0;
else{
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
}
每个叶子节点到根节点的路径
//每个叶子节点到根结点的路径
void PrintAllPath(BiTree T,char path[],int pathlen){
int i;
if(T){
path[pathlen] = T->data;
if(T->lchild==NULL && T->rchild==NULL){
for(i=pathlen;i>=0;i--){ //倒叙输出
cout<lchild,path,pathlen+1);
PrintAllPath(T->rchild,path,pathlen+1);
}
}
}
main函数
int main(){
BiTree Tree=NULL;
CreateBiTree(&Tree); //初始化
cout<<"------初始化------"<
运行结果