题意
实现二叉树的链式存储和部分的函数
思路
这是一个链式存储实现的二叉树。首先 是构造了一个名为 node 的 二叉树数据结构内有(1)char 变量,(2)两个指向其本身的结构体指针变量 lch,rch.然后 用typedef分别给 node结构体起了一个Bn的别名和给 node* 起了一个Bt 的别名方便后面代码的使用。Bn和Bt分别是代表二叉树节点 类型和二叉树节点指针。在主函数里先定义了一个结构体指针(node *) 类型的变量 head,这个结构体指针变量 head是我们要构造的二叉树的根结点;(变量的本质是在内存中开辟一块空间,这块空间在内存中有相应的地址,而空间里存放我们要存放的数据。)在 cbtree函数里头 形参 是( Bt &T) 意思是定义了一个结构体指针变量 T ,而 T前面的 & 起到了一个引用传递(意思是调用函数cbtree时引用了head变量)的作用。cbtree函数内部是一个先序构造二叉树的操作,前面已说明是在head上进行操作则在调用cbtree函数的开始就是对 head 结点的操作 。输入date 数据 c如果c是' , ' 则变量T(这步操作是变量head为空,接下来的递归操作就是具体的树的左右分支结点为空)就为空,否则进行 T=new Bn(T=new Bn,申请一块该类型空间,并把地址返回,借此完成了结构体指针变量的初始化)并把 c 的值赋给T->date(这步操作是把 c 的值赋给结构体指针变量head的,接下来的递归操作就是给具体的树的左右分支结点赋值),接下来就是递归操作实现左右子树的构建。
code
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef struct node
{
char date;
node *lch,*rch;// 在结构体中定义指针型的左子树和右子树
}Bn,*Bt; // Bn 代表结点 *Bt代表根节点
void cbtree(Bt &T) // 先序建二叉树
{
char c;
scanf("%c",&c);
if(c==',')
T=NULL;
else
{
T=new Bn;
T->date=c;
cbtree(T->lch);
cbtree(T->rch);
}
return ;
}
void pre(Bt T) //先序遍历二叉树
{
if(T)
{
printf("%c",T->date);
pre(T->lch);
pre(T->rch);
}
}
void in(Bt T) //中序遍历二叉树
{
if(T)
{
in(T->lch);
printf("%c",T->date);
in(T->rch);
}
}
void post(Bt T) //后序遍历二叉树
{
if(T)
{
post(T->lch);
post(T->rch);
printf("%c",T->date);
}
}
void level(Bt T) //层次遍历二叉树
{
queue<Bn> Q;
Q.push(*T);
while(!Q.empty())
{
Bn next=Q.front();
Q.pop();
printf("%c",next.date);
if(next.lch) Q.push(*(next.lch));
if(next.rch) Q.push(*(next.rch));
}
}
int cnt=0;
void cntleaf1(Bt T) //求叶子节点
{
if(T)
{
if(!T->lch&&!T->rch)
{
cnt++;
return ;
}
cntleaf1(T->lch);
cntleaf1(T->rch);
}
}
int cntleaf2(Bt T) //求叶子节点
{
if(!T) return 0;
if(!T->lch&&!T->rch) return 1;
else
{
int n1=cntleaf2(T->lch);
int nr=cntleaf2(T->rch);
return n1+nr;
}
}
int dep(Bt T) //求二叉树的深度
{
int ddep=0;
if(!T) return ddep;
int n1=dep(T->lch);
int nr=dep(T->rch);
return (n1>nr ? n1:nr)+1 ;
}
int main()
{
Bt head;
cbtree(head); // 先序遍历二叉树
pre(head);
printf("\n");
in(head); // 中序遍历二叉树
printf("\n");
post(head); // 后序遍历二叉树
printf("\n");
level(head); // 层次遍历二叉树
printf("\n");
cntleaf1(head); // 求二叉树的叶子节点
printf("%d\n",cnt);
printf("%d\n",cntleaf2(head)); // 求二叉树深度
printf("%d\n",dep(head));
}