数据结构------利用Qt画出树的结构

这两天学习二叉树的时候,总感觉不够直观,又在csdn上看到了一篇利用Qt画出一棵树的结构。试着自己写了下,总没人家画的好看。不过有了这个经验,正好就用在了正在学习的数据结构上。

基本介绍:

TreeWidget类负责绘制,构造该类的时候需要传入一个BinaryTreeNode(在之前的数据结构笔记BinaryTree里使用的节点类,我在学习二叉搜索树等时也用了这个类作为树的结点,因此也可以用来画其他类型的树),当然该结点必须已经是构造好的树的根节点(该类只负责根据结点关系绘制),然后根据该结点的leftChild,rightChild去不断的递归绘制结点间的线段。

主要是重写了paintEvent函数

virtual void paintEvent(QPaintEvent *e);

里面负责递归绘制的是:

void draw(BinaryTreeNode<T> *node, int x, int y, int angle, bool isLeft, int depth, QPainter *p);// 其实跟树的遍历是一个想法

其中

x,y是该结点坐标,angle表示边的角度,isLeft表示是否是左儿子,传入这个值主要是想是树画得别两条边交叉到一块了,不过结果并不理想,知道如何设置参数才能使树的边不交叉的同学教我一下,谢谢:-D。depth是深度,深度越大时,画得线相应短一些。

如上篇笔记里的,二叉树画出来的样子:

数据结构------利用Qt画出树的结构_第1张图片

二叉树的文件我放在了binaryTree文件夹下,该gui程序源文件放在了gui文件夹下,两个文件夹是同级的。所以TreeWidget.h有这一句:

#include "../binaryTree/binaryTree.h",如果不这么放需要修改这里。

对应的,#include "../binarySearchTree/binarySearchTree.h"是为了画二叉搜索树,没有这个文件就先注掉,等学习并写好二叉搜索树的代码后,我会放上来。

问题:

1. 之前提到的,因为角度都用的随机数,需要设置上其他合适的参数,否则树的边会有交叉。

2. 模板的实现必须放在h文件里,而Qt实现放在h文件里好像容易出问题,所以写了这么一句typedef char T;本来想写成template的。发现自己懂得太少,写不通。。。。

程序源代码: /Files/izualzhy/gui.rar