求森林叶子结点数
2015-05-08 20:48
393 查看
本文以孩子兄弟表示法存储森林,列出求森林叶子结点的递归与非递归算法。
运行结果:
#include "stdio.h" #include "malloc.h" typedef struct CSNode { int data; struct CSNode *lchild, *rbrother; }CSNode, *Tcsnode; typedef struct { Tcsnode data[50]; int front, rear; }queue; void create(Tcsnode &T); //先序创建森林 void postorder(Tcsnode T); //后序遍历 void leave1(Tcsnode T); //非递归求叶子结点数 int leave2(Tcsnode T); //递归求叶子结点数 int main() { int k; Tcsnode T; printf("孩子兄弟表示法先序创建森林:\n"); create(T); printf("后序遍历:\n"); postorder(T); printf("\n"); leave1(T); k = leave2(T); printf("该森林叶子结点数为%d!\n", k); return 0; } //先序创建二叉树 void create(Tcsnode &T) { int a; scanf("%d", &a); if((a != 0)) { T = (Tcsnode)malloc(sizeof(CSNode)); T->data = a; create(T->lchild); create(T->rbrother); } else T = NULL; } //中序遍历二叉树,即后序遍历森林,两棵树之间通过换行符隔开 void postorder(Tcsnode T) { if(T != NULL) { postorder(T->lchild); printf("%d ", T->data); if(T->data == 1) //1为第一棵树的根结点 printf("\n"); postorder(T->rbrother); } } //非递归算法求森林叶子结点,即求该二叉树无左子树的结点数 void leave1(Tcsnode T) { int k = 0; Tcsnode p; queue q; q.front = q.rear = -1; if(T == NULL) printf("该森林叶子结点数为0!\n"); else { q.data[++q.rear] = T; while(q.front < q.rear) { p = q.data[++q.front]; if(p->lchild != NULL) q.data[++q.rear] = p->lchild; else k++; if(p->rbrother != NULL) q.data[++q.rear] = p->rbrother; } printf("该森林叶子结点数为%d!\n", k); } } //递归算法求森林叶子结点 int leave2(Tcsnode T) { if(T == NULL) return 0; if(T->lchild == NULL) return leave2(T->rbrother) + 1; else return leave2(T->lchild) + leave2(T->rbrother); }
运行结果:
相关文章推荐
- 从森林到咖啡馆——书评《J2EE设计开发编程指南》
- 火的教训~~~谨记87年森林大火
- 提升活动目录域和森林的功能级别
- 偶然发现51cto论坛中界面风格选择“钢铁森林”会出现问题
- 转自森林:注释书写规范 Ghost
- “嘿,听说有支新生队伍在森林里反猎捕那些内院老生了!”
- 解密:把一个“森林”搬进家需几步骤
- 小波变换网文精粹:小波:看森林,也看树木(三)
- 树 森林 与二叉树的转换
- [SCOI2004]森林-枚举 凸包
- 协议森林10 魔鬼细节 (TCP滑窗管理)
- hdu 3367 伪森林,not 最大生成树
- hdu 1273 漫步森林
- 随机决策森林——OpenCV类CvRTrees使用实例
- Poj 3723 Conscription -- 最大生成树(森林)
- 并查集的森林封装
- 第一章 明了佛陀的教导(宁静的森林水池)
- (转)协议森林09 爱的传声筒 (TCP连接)
- 分类和回归树,随机森林,霍夫森林(CART,random forests,hough forests)
- 并查集—分离集合森林实现