算法导论 之 平衡二叉树 - 打印 - 递归[C语言]
来源:互联网 发布:藏剑二少捏脸数据 编辑:程序博客网 时间:2024/05/22 15:25
- 作者:邹祁峰
- 邮箱:Qifeng.zou.job@hotmail.com
- 博客:http://blog.csdn.net/qifengzou
- 日期:2013.12.17 11:00
- 转载请注明来自"祁峰"的CSDN博客
1 前言
在之前的博文《算法导论 之 平衡二叉树 - 插入、查询、销毁》中已经给出了构建平衡二叉树的C语言实现过程,但随着结点的增加和树结构的不断旋转变化,也许插入、查找、删除等操作还存在一定的BUG,经过一段时间后,我很难知道当前平衡二叉树的实际结构,因此,增加打印平衡二叉树当前结构的函数显得十分必要。
2 代码实现
此段代码中出现的部分结构体、枚举、宏和函数等已在博文《算法导论 之 平衡二叉树 - 插入、查询、销毁》中定义和实现,请结合以上博文一起阅读。
/****************************************************************************** **函数名称: val_print **功 能: 打印平衡二叉树(外部接口) **输入参数: ** tree: 平衡二叉树 **输出参数: NONE **返 回: VOID **实现描述: **注意事项: **作 者: # Qifeng.zou # 2013.12.17 # ******************************************************************************/int avl_print(const avl_tree_t *tree){ if(NULL == tree->root) { return AVL_SUCCESS; } _avl_print(tree->root, 0); /* 打印结点 */ return AVL_SUCCESS;}
代码1 打印AVL(对外接口)
/****************************************************************************** **函数名称: avl_print_head **功 能: 打印结点头(内部接口) **输入参数: ** node: 被打印的结点 ** depth: 结点深度 **输出参数: NONE **返 回: VOID **实现描述: **注意事项: **作 者: # Qifeng.zou # 2013.12.17 # ******************************************************************************/void avl_print_head(avl_node_t *node, int depth){ int idx = 0; avl_node_t *parent = node->parent; while(depth > 1) { depth--; if(1 == depth) { fprintf(stderr, "|"); for(idx=0; idx<8; idx++) { if(0 == idx) { if(parent->lchild == node) { fprintf(stderr, "l"); } else { fprintf(stderr, "r"); } } else { fprintf(stderr, "-"); } } } else { fprintf(stderr, "|\t"); } } if((NULL == node->lchild) && (NULL == node->rchild)) { fprintf(stderr, "<%03d:%d/>\n", node->key, node->bf); } else { fprintf(stderr, "<%03d:%d>\n", node->key, node->bf); }}
代码2 打印节点头
/****************************************************************************** **函数名称: avl_print_tail **功 能: 打印结点尾(内部接口) **输入参数: ** node: 被打印的结点 ** depth: 结点深度 **输出参数: NONE **返 回: VOID **实现描述: **注意事项: **作 者: # Qifeng.zou # 2013.12.17 # ******************************************************************************/void avl_print_tail(avl_node_t *node, int depth){ int idx = 0; if((NULL == node->lchild) && (NULL == node->rchild)) { return; } while(depth > 1) { fprintf(stderr, "|\t"); depth--; } fprintf(stderr, "\n", node->key);}
代码3 打印节点尾
/****************************************************************************** **函数名称: _avl_print **功 能: 打印平衡二叉树(内部接口) **输入参数: ** node: 被打印的结点 ** stack: 栈 **输出参数: NONE **返 回: VOID **实现描述: ** 1. 结点入栈 ** 2. 打印该结点(头) ** 3. 打印该结点的右子树 ** 4. 打印该结点的左子树 ** 5. 打印该结点(尾) ** 6. 结点出栈 **注意事项: **作 者: # Qifeng.zou # 2013.12.17 # ******************************************************************************/static int _avl_print(const avl_node_t *node, int depth){ /* 1. 打印结点头 */ avl_print_head(node, depth); /* 2. 打印右子树 */ if(NULL != node->rchild) { _avl_print(node->rchild, depth+1); } /* 3. 打印左子树 */ if(NULL != node->lchild) { _avl_print(node->lchild, depth+1); } /* 4. 打印结点尾 */ avl_print_tail(node, depth); return AVL_SUCCESS;}
代码4 打印结点(内部接口)
3 结果展示
测试主函数如下:
#define INPUT_MAX_LEN (16)int main(void){ int ret = 0, key = 0; avl_tree_t tree; avl_node_t *node = NULL; char input[INPUT_MAX_LEN] = {0}; memset(&tree, 0, sizeof(tree)); while(1) { memset(input, 0, sizeof(input)); scanf(" %s", input); key = atoi(input)%1000; if(!strcasecmp(input, "quit") || !strcasecmp(input, "exit") || !strcasecmp(input, "q")) { fprintf(stderr, "Quit!\n"); break; } ret = avl_insert(&tree, key); if(AVL_FAILED == ret) { fprintf(stderr, "Insert failed!\n"); continue; } else if(AVL_NODE_EXIST == ret) { fprintf(stderr, "Node exist!\n"); continue; } avl_print(&tree); } avl_destory(&tree); return 0;}
代码5 测试程序
绘制平衡二叉树:
运行代码5中的主程序,随机输入数字,avl_print()将会打印出所输入的数字构造的平衡二叉树的结构,如下图所示:
图1 测试结果
0 0
- 算法导论 之 平衡二叉树 - 打印 - 递归[C语言]
- 算法导论 之 平衡二叉树 - 删除 - 递归[C语言]
- 算法导论 之 平衡二叉树 - 创建、插入、查询、销毁 - 递归[C语言]
- 算法导论 之 红黑树 - 打印、销毁 - 非递归[C语言]
- 算法导论C语言实现: 二叉搜索树(binary tree)
- 算法导论-透彻了解平衡二叉树(AVL树)
- 算法导论中C++实现平衡二叉树(AVL树)
- 算法导论 13-3 AVL平衡二叉树
- 《算法导论》二叉树遍历的递归&非递归实现
- 平衡二叉树(AVL树) ----- C语言
- C语言实现AVL-平衡二叉树
- 二叉平衡树(AVL)-C语言
- 平衡二叉树的插入C语言
- C语言实现平衡二叉树
- 二叉树的遍历(c语言非递归算法)
- 【算法】二叉树的递归遍历C语言实现
- C语言打印二叉树
- C语言 二叉树 递归
- 学习HTML5开发RPG游戏第二步>资源预加载
- ALV 参数与函数 总结
- Java编码需注意细节
- spring容器中的bean创建
- 2013年终总结--生活
- 算法导论 之 平衡二叉树 - 打印 - 递归[C语言]
- CString及string,char *与其他数据类型的转换和操作 .
- java 如何自定义异常 用代码展示 真心靠谱
- 让注册体验来得更简单点吧
- php 构造方法
- smarty2.x foreach 和section的使用
- 使用格式化的时候注意数字的范围
- 禁止firefox 缓存input
- smarty 的 modifier插件