数据结构算法—非递归算法求二叉树的叶子结点(C语言)
学过数据结构中 队列和栈的同学,应该都明白: 使用队列和栈,可以将递归算法转换成非递归算法
在递归算法中,需要重复调用函数时,在非递归算法中,就需要入栈,进入下一层。
在递归算法中,返回调用函数的结果时,在非递归算法中,就需要出栈,返回到上一层
#include<stdio.h>
#include<malloc.h>
struct node{
char info;
struct node *llink,*rlink;
};
typedef struct node NODE;
NODE *creat(){
char x;
NODE *p;
scanf("%c",&x);
printf("%c",x);
if(x!='.'){//测试输入 ABD..EH...CF.I..G.. . 表示该结点无子树 也就是 返回上一层递归
p=(NODE *)malloc(sizeof(NODE));
p->info=x;
p->llink=creat();
p->rlink=creat();
}
else
p=NULL;
return p;
}
int Countleaf(NODE *bt,int count){
int top=-1;
NODE s[100];//创建一个栈
while(bt!=NULL||top!=-1){//当前结点 或者 栈 不为空 需要继续遍历 条件不可以反
while(bt!=NULL){ //当前根节点不为空
if(bt->llink==NULL&&bt->rlink==NULL) //判断左右子树是否为空
count++;
s[++top] = *bt;//根节点有左右子树,入栈
bt = bt->llink;// 遍历根节点的 左子树
}
if(top!=-1){//判断栈是否为空
bt = &s[top--];//根节点出栈 取地址&
bt = bt->rlink;//遍历右子树
}
}
return count;
}
int main(){
NODE *T;
int count = 0;
printf("PLease input a tree:\n");
T=creat();
printf("\n");
count = Countleaf(T,count);
printf("非递归算法-->二叉树的叶子结点数为:%d",count);
printf("\n");
}
运行结果:
PLease input a tree:
ABD..EH...CF.I..G..
ABD..EH...CF.I..G..
非递归算法-->二叉树的叶子结点数为:4
--------------------------------
Process exited after 1.394 seconds with return value 0
请按任意键继续. . .