免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 18968 | 回复: 8
打印 上一主题 下一主题

[算法] 按树型形式输出二叉树 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-15 15:33 |只看该作者 |倒序浏览
有一棵二叉树,形态任意。要求按树型的形式输出这棵二叉树。例如有一棵二叉树,输出为:
             A
            / \
           B   C
          / \    \
         H   D    E
            / \  
           F   G
如何做呢?觉得有些麻烦。请教大家。

论坛徽章:
0
2 [报告]
发表于 2007-11-15 15:34 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2007-11-15 16:08 |只看该作者
我觉得层序遍历二叉树不怎么困难。这个问题麻烦在于把这棵二叉树的形状画出来。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2007-11-15 16:18 |只看该作者
关键要求有点不明确,如果是图形界面,先画谁都无所谓,然而在文字界面下,必须先画上层,再画下层(当然curses等也可以让你做到随便画)。
但是如果是文字界面,
比方一个7层的完全树,你打算怎么画呢?排不下吧.........

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2007-11-15 16:22 |只看该作者
如果你所要的算法等价于
输出
A(B(H(null,null),D(F,G)),C(null,E(null,null)))
这样的表达,那倒也不难

论坛徽章:
0
6 [报告]
发表于 2014-09-15 16:44 |只看该作者
回复 1# heavyrain44
先上图:

这是我写的一个二叉树图形化输出程序效果,具体介绍在这:
http://blog.csdn.net/copica/article/details/39291141

   

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
7 [报告]
发表于 2014-09-16 14:05 |只看该作者
写个简单的目录树类似的代码。支持127层以下的。(超过40可能会有输入出问题)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>

  5. struct binary_tree_node
  6. {
  7.         int value;
  8.         struct binary_tree_node *left, *right;
  9. };

  10. int binary_tree_get_deepth(struct binary_tree_node *tree)
  11. {
  12.         int left, right;
  13.        
  14.         if (tree != NULL) {
  15.                 left = 0;
  16.                 if (tree->left != NULL) {
  17.                         left += binary_tree_get_deepth(tree->left);
  18.                 }
  19.                 right = 0;
  20.                 if (tree->right != NULL) {
  21.                         right += binary_tree_get_deepth(tree->right);
  22.                 }
  23.                 return (left < right ? right : left) + 1;
  24.         }else {
  25.                 return 0;
  26.         }
  27. }

  28. int binary_tree_delete(struct binary_tree_node **tree)
  29. {
  30.         if (*tree != NULL) {
  31.                 if ((*tree)->left != NULL) {
  32.                         binary_tree_delete(&(*tree)->left);
  33.                 }
  34.                 if ((*tree)->right != NULL) {
  35.                         binary_tree_delete(&(*tree)->right);
  36.                 }
  37.                 free(*tree);
  38.                 *tree = NULL;
  39.         }
  40.         return 0;
  41. }

  42. int binary_tree_insert(struct binary_tree_node **tree, int value)
  43. {
  44.         struct binary_tree_node *node;

  45.         if (*tree == NULL) {
  46.                 node = (struct binary_tree_node *)malloc(sizeof(struct binary_tree_node));
  47.                 if (node != NULL) {
  48.                         memset(node, 0, sizeof(struct binary_tree_node));
  49.                         node->value = value;
  50.                         *tree = node;
  51.                         return 0;
  52.                 }else {
  53.                         return -1;
  54.                 }
  55.         }else {
  56.                 if (value < (*tree)->value) {
  57.                         return binary_tree_insert(&(*tree)->left, value);
  58.                 }else {
  59.                         return binary_tree_insert(&(*tree)->right, value);
  60.                 }
  61.         }
  62. }

  63. int binary_tree_print(struct binary_tree_node *tree, int level, char disp_tab[128])
  64. {
  65.         int i;

  66.         if (level < 127) {
  67.                 for (i = 1; i < level; ++i) {
  68.                         printf(disp_tab[i] ? "| " : "  ");
  69.                 }
  70.                 if (level) {
  71.                         printf("+-");
  72.                 }
  73.                 printf("%d\n", tree->value);
  74.                 if (tree->left != NULL) {
  75.                         disp_tab[level + 1] = tree->right != NULL;
  76.                         binary_tree_print(tree->left, level + 1, disp_tab);
  77.                 }
  78.                 if (tree->right != NULL) {
  79.                         disp_tab[level + 1] = 0;
  80.                         binary_tree_print(tree->right, level + 1, disp_tab);
  81.                 }
  82.         }
  83.         return 0;
  84. }

  85. int main(void)
  86. {
  87.         char disp_tab[128];
  88.         struct binary_tree_node *tree = NULL;
  89.         int i;

  90.         srand(time(NULL));
  91.         for (i = 0; i < 20; ++i) {
  92.                 binary_tree_insert(&tree, rand() % 100 + 1);
  93.         }
  94.         printf("deepth: %d\n", binary_tree_get_deepth(tree));
  95.         memset(disp_tab, 0, sizeof(disp_tab));
  96.         binary_tree_print(tree, 0, disp_tab);
  97.         binary_tree_delete(&tree);
  98.         return 0;
  99. }
复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
8 [报告]
发表于 2014-09-16 16:21 |只看该作者
改进版,可以完整输出二叉树。包括空结点。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>

  5. struct binary_tree_node
  6. {
  7.         int value;
  8.         struct binary_tree_node *left, *right;
  9. };

  10. int binary_tree_get_deepth(struct binary_tree_node *tree)
  11. {
  12.         int left, right;
  13.        
  14.         if (tree != NULL) {
  15.                 left = 0;
  16.                 if (tree->left != NULL) {
  17.                         left += binary_tree_get_deepth(tree->left);
  18.                 }
  19.                 right = 0;
  20.                 if (tree->right != NULL) {
  21.                         right += binary_tree_get_deepth(tree->right);
  22.                 }
  23.                 return (left < right ? right : left) + 1;
  24.         }else {
  25.                 return 0;
  26.         }
  27. }

  28. int binary_tree_delete(struct binary_tree_node **tree)
  29. {
  30.         if (*tree != NULL) {
  31.                 if ((*tree)->left != NULL) {
  32.                         binary_tree_delete(&(*tree)->left);
  33.                 }
  34.                 if ((*tree)->right != NULL) {
  35.                         binary_tree_delete(&(*tree)->right);
  36.                 }
  37.                 free(*tree);
  38.                 *tree = NULL;
  39.         }
  40.         return 0;
  41. }

  42. int binary_tree_insert(struct binary_tree_node **tree, int value)
  43. {
  44.         struct binary_tree_node *node;

  45.         if (*tree == NULL) {
  46.                 node = (struct binary_tree_node *)malloc(sizeof(struct binary_tree_node));
  47.                 if (node != NULL) {
  48.                         memset(node, 0, sizeof(struct binary_tree_node));
  49.                         node->value = value;
  50.                         *tree = node;
  51.                         return 0;
  52.                 }else {
  53.                         return -1;
  54.                 }
  55.         }else {
  56.                 if (value < (*tree)->value) {
  57.                         return binary_tree_insert(&(*tree)->left, value);
  58.                 }else {
  59.                         return binary_tree_insert(&(*tree)->right, value);
  60.                 }
  61.         }
  62. }

  63. int binary_tree_print(struct binary_tree_node *tree, int level, char disp_tab[128])
  64. {
  65.         int i;

  66.         if (level < 127) {
  67.                 for (i = 1; i < level; ++i) {
  68.                         printf(disp_tab[i] ? "| " : "  ");
  69.                 }
  70.                 if (level) {
  71.                         printf("+-");
  72.                 }
  73.                 if (tree == NULL) {
  74.                         printf("\n");
  75.                 }else {
  76.                         printf("%d\n", tree->value);
  77.                         if (tree->left != NULL || tree->right != NULL) {
  78.                                 disp_tab[level + 1] = 1;
  79.                                 binary_tree_print(tree->right, level + 1, disp_tab);
  80.                                 disp_tab[level + 1] = 0;
  81.                                 binary_tree_print(tree->left, level + 1, disp_tab);
  82.                         }
  83.                 }
  84.         }
  85.         return 0;
  86. }

  87. int main(void)
  88. {
  89.         char disp_tab[128];
  90.         struct binary_tree_node *tree = NULL;
  91.         int i;

  92.         srand(time(NULL));
  93.         for (i = 0; i < 20; ++i) {
  94.                 binary_tree_insert(&tree, rand() % 100 + 1);
  95.         }
  96.         printf("deepth: %d\n", binary_tree_get_deepth(tree));
  97.         binary_tree_print(tree, 0, disp_tab);
  98.         binary_tree_delete(&tree);
  99.         return 0;
  100. }
复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
9 [报告]
发表于 2014-09-16 16:29 |只看该作者
我也上个图

aaa.JPG (11.93 KB, 下载次数: 78)

aaa.JPG
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP