数据结构の学习(M):可视化一棵二叉树
学习树的时候,我们有一个最大的疑惑,就是如何可视化一颗二叉树。因为你总不可能指望永远在嵌套列表中看出一颗树出来。我们希望更直观一些,就像上面那副图一样,简单漂亮。这正是笔者在学习树开始时干的第一件事。
不幸的是,笔者的博客将不会有完整代码(示范代码除外),所有代码均已上传到码云上。如果时间和精力允许的话,强烈建议你根据思路,手动写一遍,相信你会感觉到全身毛孔舒张而不是想砸电脑的快感。
很棒,我们首先介绍一个小巧精致的python自带的绘图工具,Turtle。如果你还不熟悉它的话,你可以花几分钟了解官方英文文档。在你了解了主要函数之后,我简单介绍一下执行流程:
1)实例化turtle类,设置画布大小和背景。设置为penup模式(抬起画笔),设置绘图速度(一般的是norma),设置光标(当然是可爱的turtle啦);
2)设置起点,设置为pendown模式(放下画笔),有两种方法画直线,一种是用goto函数直线前进到终点。另一种是先设置方向setheading,再forward到终点。还有一些比如画圆circle,写字write函数也经常用到;
3)完成绘图后一定要执行turtle.done()
是不是很简单呢?
我们画二叉树的主要方法是递归。我们从根节点开始,先遍历左子树,再遍历右子树。这是典型的前序遍历,但我们在这里不作介绍。另外画树也很有技巧,如果你是一个画家,你会花很多时间去让的你的作品美观,但是作为程序员,我们希望用最简洁最直观的方式去实现它的功能。我们可以写一个画节点函数draw_node,它可以在一个特定坐标(x,y)去画一个圆,turtle画圆是从边缘某个点逆时针画圆的,比如这里我们可以设置为圆的正下方最低点。然后在圆中间写上字符数据。之后我们实现一个画树枝的函数draw_branch,它的 作用是从某一点(比如圆的最低点)向左或向右沿特定方向画一条线段,你可以设置它的粗细和颜色。但是如果你让树每一个深度的树枝张开角度一样的话,那么结果一定不会让你高兴,下面节点会重合,因此我们需要让树枝张开的角度随着深度加深适当减小一些,当然你也可以让树枝变短一些。这实际是一个几何题,当然,不必花太多时间纠结。我们还可以用一个字典去记录所有节点的坐标,这样的话,我们后面可以将树的遍历路径画出来,这想法是不是很不错!
思路如下:
1)我们先定义printTree类,然后依次完成draw_branch,draw_node基础函数:
2)我们定义一个函数draw_binary_tree。从根节点开始遍历,终止条件是node==None。我们设置一个整数变量level记录树的深度,先画一个节点,然后看它有没有左子树,如果有的话,先把树枝画出来,递归调用draw_binary_tree,传入的是左子节点。右边也是一样。
最后你就可以得到一个海龟画的树了。这是动画
希望本博客对你有帮助。