源代码:#include
using namespace std;
#define MAXSIZE 30
typedef struct BT{
char data;
struct BT *lchild,*rchild;//表示建立一个struct BT类型的左右孩子指针变量,这样左右孩子指针只能指向struct BT类型//
}BT;//二叉树的定义,使用typedef后,BT等价于struct BT了,省事了//
void Creat(BT *T){ //先序建立二叉树,BT *T表示形式参数为一个BT类型(使用了Typedef,所以BT等价于struct BT)的T指针变量,用来接收上一级的左右孩子指针)//
char ch;
cin>>ch;
if(ch == '#')T = NULL;
else{
T = new BT;//new分配内存过程为调用构造BT的函数,返回一个指向分配内存的首地址的指针//
T->data = ch;
Creat(T->lchild);
Creat(T->rchild);
}
}
int Num1(BT *T){ //统计度为1的节点的个数
if(T == NULL)return 0;
if(T->lchild == NULL&&T->rchild != NULL){
return Num1(T->rchild)+1;//若左孩子为空,右孩子非空,则将度为1 的只有右孩子的结点数加一//
}
else if(T->lchild != NULL&&T->rchild == NULL){
return Num1(T->lchild)+1;//若右孩子为空,左孩子非空,则将度为1的只有左孩子的结点数加一//
}
else{
return Num1(T->rchild)+Num1(T->lchild);
}
}
void Route(BT *T,char *path,int pathlen){ //输出二叉树中从每个叶子结点到根结点的路径
if(T == NULL){
return;
}//如果此结点为空,则返回//
if(T->lchild == NULL && T->rchild == NULL){
cout
for(int i = pathlen-1; i >= 0; i--){
cout
}//如果此结点的左右孩子都为空,则输出数组path的值//
else{
path[pathlen++] = T->data;
Route(T->lchild,path,pathlen);
Route(T->rchild,path,pathlen);//这里注意为什么要频繁的调用path数组和下标,这是因为保证了调用完左孩子的路径后保证了path为未调用之前的状态,如果使用全局变量,则调用完T->lchild之后path数组有冗余的上层数值,这样下面调用T->rchild时path数组还有“上级余孽”,这也是为什么不直接使用全局变量的原因//
}
}
int main(){
BT *tree;
char path[MAXSIZE];
cout<
Creat(tree);
cout<
cout<
Route(tree,path,-1);
}
学习笔记: