How to print a tree-ADT ? 打印树形结构的算法

How to print a tree-ADT

写和树相关的代码的时候老是不方便debug,因为树形结构虽然能够代码构造出来

但是如果能够有个很好的方法可视化就更好了。

前些天看到一个MIT的代码片段,感激~....

一开始你可能会想到一种比较简单的迭代实现,就像之前我做的

  1. void putout(int S, int *n)

实现在这里

http://blog.csdn.net/cinmyheart/article/details/43086233

这个函数会打印一个三角形

而我看到MIT老师准备的教学用的Python代码时就眼前一亮的感觉,有了一种更“精准的“打印三角形的策略——基于递归。

    def _str(self):
        """Internal method for ASCII art."""
        label = str(self.key)
        if self.left is None:
            left_lines, left_pos, left_width = [], 0, 0
        else:
            left_lines, left_pos, left_width = self.left._str()
        if self.right is None:
            right_lines, right_pos, right_width = [], 0, 0
        else:
            right_lines, right_pos, right_width = self.right._str()
        middle = max(right_pos + left_width - left_pos + 1, len(label), 2)
        pos = left_pos + middle // 2
        width = left_pos + middle + right_width - right_pos
        while len(left_lines) < len(right_lines):
            left_lines.append(' ' * left_width)
        while len(right_lines) < len(left_lines):
            right_lines.append(' ' * right_width)
        if (middle - len(label)) % 2 == 1 and self.parent is not None and            self is self.parent.left and len(label) < middle:
            label += '.'
        label = label.center(middle, '.')
        if label[0] == '.': label = ' ' + label[1:]
        if label[-1] == '.': label = label[:-1] + ' '
        lines = [' ' * left_pos + label + ' ' * (right_width - right_pos),
                 ' ' * left_pos + '/' + ' ' * (middle-2) +
                 '\\' + ' ' * (right_width - right_pos)] +           [left_line + ' ' * (width - left_width - right_width) + right_line
           for left_line, right_line in zip(left_lines, right_lines)]
        return lines, pos, width
    def __str__(self):
        return '\n'.join(self._str()[0])

代码没给注释,折腾我好些时候。。。递归。。。

(过段时间我再注释,先把代码贴出来)

下面是个的改动版本,还有点需要完善的地方,不过还能凑合用:

      def __str__(self):

          def recurse(node) :
               if node is None:
                   return [], 0, 0
               else :
                   left_lines, left_pos, left_width = recurse(node.left)
                   right_lines, right_pos, right_width = recurse(node.right)

		   label = str(node.number)

		   middle = max(right_pos + left_width - left_pos +1, len(label), 2)
		   pos    = left_pos + middle//2
		   width  = left_pos + middle + right_width - right_pos

                   while len(left_lines) < len(right_lines) :
                       left_lines.append(' ' * left_width)
                   while len(right_lines) < len(left_lines) :
                       right_lines.append(' ' * right_width)

		   line   = [' ' * left_pos + label + ' ' * (right_width-right_pos + 1),
			     ' ' * left_pos + '/' +
                             ' ' * (middle-2) + '\\' +
			     ' ' * (right_width - right_pos)
                            ] +                             [
				    left_line +
				    ' ' * (width - left_width - right_width) +
				    right_line
				    for left_line, right_line
				    in zip(left_lines, right_lines)
                            ]

		   if node is self.root :
		       return line
		   else :
		       return line, pos, width

          if self.root is None :
               return '<Empty tree>'

          output = recurse(self.root)
          for i in range(1, len(output)-2) :
              output[0] += '\n' + output[i]

          return output[0]

demo:

大体的树形结构和层次是清楚的

后续会update,把原理讲清楚。。。递归实现

时间: 2024-10-21 13:15:41

How to print a tree-ADT ? 打印树形结构的算法的相关文章

【转】linux tree命令以树形结构显示文件目录结构 ---- 不错

原文网址:http://jingyan.baidu.com/article/acf728fd19c7eff8e510a3eb.html 今天小编来给分享Linux 系统下一个非常有用的命令的使用:tree命令可以以树形结构显示文件目录结构,它非常适合于我们给别人介绍我们的文件目录的组成框架,同时该命令使用适当的参数也可以将命令结果输出到文本文件中. 本经验说明: 小编的这个建议只适合于10.10之前版本的ubuntu系统,后面的11.04,11.10...14.04系统因为采用的默认桌面不同,所

关于EasyUI使用tree方法生成树形结构加载两次的问题

html代码中利用class声明了easyui-tree,导致easyUI解析class代码的时候先解析class声明中的easyui-tree这样组件就请求了一次url:然后又调用js初始化代码请求一次url.这样导致了重复加载,解决的方法就是只用一种初始化方法来声明easyUI组件以避免重复的提交请求,即删除html中的class声明(class="easyui-tree"): 加载两次的写法: <div class="easyui-panel" styl

tree命令以树形结构显示目录结构

一.安装 Centos7.4虚拟机执行以下命令安装:yum  install tree 二.基本使用 1.查看帮助信息:tree --help 2.查看root目录下目录结构:#tree 3.查看第N级目录文件:tree -L n 4.重定向到文件 原文地址:https://www.cnblogs.com/jason89/p/10231341.html

Linux/Ubuntu tree 命令以树形结构显示文件夹目录结构

在终端输入命令 sudo apt-get -y install tree 原文地址:https://www.cnblogs.com/rzkwz/p/12590474.html

linux tree命令以树形结构显示文件目录结构

http://jingyan.baidu.com/article/acf728fd19c7eff8e510a3eb.html winscp  传递文件到ubuntu上用winscp

php:树形结构的算法

从喜悦村上转载,以前也读过此文,讲述得还是比较清楚的. 产品分类,多级的树状结构的论坛,邮件列表等许多地方我们都会遇到这样的问题:如何存储多级结构的数据? 在 PHP的应用中,提供后台数据存储的通常是关系型数据库,它能够保存大量的数据,提供高效的数据检索和更新服务.然而关系型数据的基本形式是纵横交错的表,是一个平面的结构,如果要将多级树状结构存储在关系型数据库里就需要进行合理的翻译工作.接下来我会将自己的所见所闻和一些实用的经验和大家探讨一下. 层级结构的数据保存在平面的数据库中基本上有两种常用

salesforce 零基础学习(七十)使用jquery tree实现树形结构模式

项目中UI需要用到树形结构显示内容,后来尽管不需要做了,不过还是自己做着玩玩,mark一下,免得以后项目中用到. 实现树形结构在此使用的是jquery的dynatree.js.关于dynatree的使用可以参考:http://wwwendt.de/tech/dynatree/doc/dynatree-doc.html#h4.2 对于树形结构,这里不做太多介绍,树一般需要一个根节点,根节点下面可以有很多子节点或者叶子节点,子结点也可以包含叶子结点或者子节点.我们在设计表结构的时候可以考虑自连接操作

树形结构的数据库表Schema设计-基于左右值编码

树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完 成持久化.然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适的Schema及其对 应的CRUD算法是实现关系型数据库中存储树形结构的关键. 理想中树形结构应该具备如下特征:数据存储冗余度小.直观性强:检索遍历过程简单高效:节点增删改查CRUD操作高效.无意

Tree Operations 打印出有向图中的环

题目: You are given a binary tree with unique integer values on each node. However, the child pointers on each node may point to any other node in the tree including itself, introducing cycles into the binary tree. A cycle is defined when you can trave