递归遍历二叉树
2016-05-18 23:27
267 查看
#include <stdio.h> #include <string.h> #include <stdlib.h> // 二叉链表表示法 typedef struct tag_BiTNode { struct tag_BiTNode *lchild; // 左孩子 struct tag_BiTNode *rchild; // 右孩子 char data; // 数据 }BiTNode; // 先序遍历 void xianxuOrder(BiTNode * root) { // 空树 递归结束的条件 if (root == NULL) { return; } // 先根 printf("%c ", root->data); // 左子树 xianxuOrder(root->lchild); // 右子树 xianxuOrder(root->rchild); } // 中序遍历 void zhongxuOrder(BiTNode* root) { // 空 if (root == NULL) { return; } // 左子树 zhongxuOrder(root->lchild); // 根节点 printf("%c ", root->data); // 右子树 zhongxuOrder(root->rchild); //// } // 后序遍历 void houxuOrder(BiTNode* root) { // 空 if (root == NULL) { return; } // 左子树 houxuOrder(root->lchild); // 右子树 houxuOrder(root->rchild); // 根节点 printf("%c ", root->data); } // 求树的叶子节点数 int num = 0; void leafNum(BiTNode* root) { // 空树 if (root == NULL) { return; } // 叶子节点 if (root->lchild == NULL && root->rchild == NULL) { num++; } // 遍历左子树 leafNum(root->lchild); // 右子树 leafNum(root->rchild); } void leafNum_plus(BiTNode* root, int *num) { // 空树 if (root == NULL) { return; } // 叶子节点 if (root->lchild == NULL && root->rchild == NULL) { (*num)++; } // 遍历左子树 leafNum_plus(root->lchild, num); // 右子树 leafNum_plus(root->rchild, num); } int leafNum_plus2(BiTNode* root) { // 空树 if (root == NULL) { return 0; } if (root->lchild == NULL && root->rchild == NULL) { printf(" %c ", root->data); return 1; } int left = leafNum_plus2(root->lchild); int right = leafNum_plus2(root->rchild); return left + right; } void main() { BiTNode nodeA, nodeB, nodeC, nodeD, nodeE, nodeF, nodeG; memset(&nodeA, 0, sizeof(BiTNode)); memset(&nodeB, 0, sizeof(BiTNode)); memset(&nodeC, 0, sizeof(BiTNode)); memset(&nodeD, 0, sizeof(BiTNode)); memset(&nodeE, 0, sizeof(BiTNode)); memset(&nodeF, 0, sizeof(BiTNode)); memset(&nodeG, 0, sizeof(BiTNode)); // 赋值 nodeA.data = 'A'; nodeA.lchild = &nodeB; nodeA.rchild = &nodeC; nodeB.data = 'B'; nodeB.lchild = &nodeD; nodeB.rchild = &nodeE; nodeC.data = 'C'; nodeC.lchild = &nodeF; nodeC.rchild = &nodeG; nodeD.data = 'D'; nodeE.data = 'E'; nodeF.data = 'F'; nodeG.data = 'G'; // 先序 printf("先序遍历: \n"); xianxuOrder(&nodeA); printf("\n"); // 中序 printf("中序遍历: \n"); zhongxuOrder(&nodeA); printf("\n"); // hou序 printf("后序遍历: \n"); houxuOrder(&nodeA); printf("\n"); leafNum(&nodeA); printf("叶子节点数: %d\n", num); int nuber = 0; leafNum_plus(&nodeA, &nuber); printf("叶子节点数_plus: %d\n", nuber); nuber = leafNum_plus2(&nodeA); printf("叶子节点数_plus: %d\n", nuber); system("pause"); }
相关文章推荐
- highcharts学习推荐
- Linux时间参数与find命令
- wordpress 常见错误小结!
- 女孩面试后收露骨短信:希望你工作严肃私下堕落
- ps切图后 内容居中
- centos6.0 安装ie6 (兼容测试用的到)
- vi 常用操作
- mysql导出,导入csv文件 多出空记录
- IE6 fixed 兼容问题
- Mysql 事务(一)
- ecmall 支付宝无法安装
- Mahout-0.9配置
- java之String
- C#/获取本机IP的代码
- Python抽象工厂模式
- 嘉缘人才系统_BUG修复 出生日期总提示需大于12岁
- 安装系统简明教程(windows)
- 用wget做站点镜像
- ecmall 页面空白解决方案汇总 (仅供参考)
- 网站开发 百度地图的添加 (自定义地址)