1.       问题描述

用递归算法绘制一棵树

2.       解决思路

用二叉树的数据结构来描述树的结构,首先创建一个二叉树,创建时要初始化节点的一些信息,伪代码如下:

If  current depth is last
    then return null
End If 
Create a branch 
If current branch is left
    then initial the branch as a left branch 
Else
    then initial the branch as a right branch
End If
Create the left branch of this recursively
Create the right branch of this recursively
return the root branch

然后再遍历二叉树,遍历的同时绘制树枝,伪代码如下:

If  current branch has left branch
    then paint the left branch
End If 
If current branch has right branch
    then paint the left branch
End If
Paint the left branch of this recursively
Paint the right branch of this recursively

3.       代码实现

创建树的代码:

Branch *DrawTrees::createTree(Branch *preRoot, bool isLeft)
{if(preRoot->depth > depth)//判断是否到达设置的深度return NULL;Branch *root = new Branch();if(!root)return NULL;root->depth = preRoot->depth + 1;if(root->depth < 3){//最底下三层的树枝角度较小if(isLeft){root->angle = preRoot->angle + qrand()%15;root->length = preRoot->length - preRoot->length / (3+qrand()%7);}else{root->angle = preRoot->angle - qrand()%15;root->length = preRoot->length - preRoot->length / (3+qrand()%7);}root->width = preRoot->width * 0.8;}else{if(branchNumCount[root->depth] >= maxBranchNum[root->depth])return NULL;else{if(isLeft)root->angle = preRoot->angle+(45-root->depth*3+qrand()%(40-root->depth*2));elseroot->angle = preRoot->angle-(45-root->depth*3+qrand()%(40-root->depth*2));root->length = preRoot->length-preRoot->length/(3+qrand()%7);root->width = preRoot->width * 0.618;branchNumCount[root->depth]++;}}//计算当前树枝起点的坐标root->x= preRoot->x + root->length*cos(root->angle*ONEANGLE);root->y= preRoot->y - root->length*sin(root->angle*ONEANGLE);//当树枝宽带减小到1时不再减小if(root->width < 1)root->width = 1;root->left = createTree(root, true);  //递归创建左子树root->right = createTree(root, false); //递归创建右子树return root ;}

绘制树的代码:

void DrawTrees::paintTree(Branch *root)
{if(!root)return;int dstX,dstY;if(!root->left) {//左子树为空则画叶子dstX=root->x+1;dstY=root->y+1;painter->setPen(QPen(QBrush(QColor(0,140,0,255)),LEAVE_WIDTH,Qt::SolidLine,Qt::RoundCap));painter->drawLine(root->x,root->y,dstX,dstY);}else{//否则画树枝dstX=root->left->x;dstY=root->left->y;painter->setPen(QPen(QColor(160, 82, 45),root->width,Qt::SolidLine,Qt::RoundCap));painter->drawLine(root->x,root->y,dstX,dstY);}if(!root->right){dstX=root->x+1;dstY=root->y+1;painter->setPen(QPen(QBrush(QColor(0,140,0,255)),LEAVE_WIDTH,Qt::SolidLine,Qt::RoundCap));painter->drawLine(root->x,root->y,dstX,dstY);}else{dstX=root->right->x;dstY=root->right->y;painter->setPen(QPen(QColor(160, 82, 45),root->width,Qt::SolidLine,Qt::RoundCap));painter->drawLine(root->x,root->y,dstX,dstY);}paintTree(root->left);//递归绘制左子树paintTree(root->right);//递归绘制右子树}

4.       运行结果

5.       小结

主要思路就是使用二叉树创建一棵树,然后遍历。为了使显示效果更好,加入一个随机控制,比如控制树枝的角度和每层节点的数量,使最终效果不是一个完全二叉树,这样使每层上都有叶子。

源代码:点击打开链接

递归画树(Qt实现)相关推荐

  1. C#——《C#语言程序设计》实验报告——泛型与集合——“画树”程序

    一.实验目的 掌握运算符重载. 掌握索引符的编写. 掌握常用非泛型集合类和集合类的使用: 掌握可空类型的使用 二.实验内容 改进"画树"的例子程序,画出不同风格的"树&q ...

  2. 第11章 递归分形树(《Python趣味创意编程》教学视频)

    (图书介绍:童晶:<Python趣味创意编程>新书预告) 本章我们将绘制递归分形树,如图所示.首先学习递归的概念,并学习if-elif-else语句:接着学习分形的概念,并利用递归调用绘制 ...

  3. 神奇!教你如何用Python来画树

    古人有诗云"庭中有奇树,绿叶发华滋",树之美,或婀娜.或繁茂.或苍劲.或青翠.python-turtle笔下的树更是别有一番风味. 01 小园新种红樱树,闲绕花行便当游 # cod ...

  4. ASP.NET通过递归添加树(Treeview)

    先来看看效果,基本上就是这样的. 所谓树,无非就是2点,第一个:根节点,第二:叶子节点,其中叶子节点中还可能有叶子节点,但是根节点始终只有一个. 下面贴上 各部分的代码 1.PAGE_LOAD载入事件 ...

  5. java 画树_java – 如何绘制代表连接节点图的树?

    我想在Java GUI中显示树,但我不知道如何.树代表连接节点的图形,如下所示: 我应该说我有自己的树类: public class BinaryTree { private BinaryNode r ...

  6. java 画树_java – 如何绘制代表连接节点图的树?

    我想在 Java GUI中显示树,但我不知道如何.树代表连接节点的图形,如下所示: 我应该说我有自己的树类: public class BinaryTree { private BinaryNode ...

  7. php递归实现层级树状展开,PHP递归实现层级树状展开,php递归层级树状_PHP教程...

    PHP递归实现层级树状展开,php递归层级树状 本文实例为大家分享了PHP递归实现层级树状展开的主要代码,供大家参考,具体内容如下 效果图: 实现代码: $arr['id'], 'fid' => ...

  8. 递归展示树状图/树状表格

    递归展示树状图 一.数据库表设计 二.后端java递归代码 三.前端展示树状表格 四.效果展示 一.数据库表设计 这里我们采用自关联的设计,通过id和pid的对应来确认数据的上下级关系 建表语句,我这 ...

  9. 递归实现树状分级部门树《部门单表》

    展示: 为了更好的展示数据实现过程:该功能采用mybatis写xml的方式实现,同样的mybatis-plus也能实现该功能,实现树状主要是通过递归这个方法把数据封装到集合里面返回给前端: 1.数据库 ...

最新文章

  1. 树,森林,二叉树的互相转换
  2. vue-element-admin中 vuex 的使用
  3. 洛谷 P2389 电脑班的裁员 解题报告
  4. Swift中文教程(十五) 析构
  5. linux驱动大全,linux驱动
  6. NeHe OpenGL教程(中文版附源代码)
  7. 亲戚问我工资多少钱,该说实话吗?
  8. 程序员能力的四个境界
  9. WebRoot到底是什么鬼?我改它的名可以吗?
  10. 信息检索2.1书刊资料检索工具--书目note
  11. RabbitMQ + TSL 实现安全访问
  12. Pulsar bk报错Unable to allocate memory, exiting bookie
  13. 数据结构及算法之异或
  14. R语言之读取Excel及csv数据
  15. Java栈的实现数组和链表
  16. 前端之CSS篇(四)——CSS浮动详解
  17. 15个经典面试问题及回答思路,很多人死在了最后一个问题上
  18. 怎样优化cocos2d/x程序的内存使用和程序大小
  19. 优酷鸿蒙开发实践|多屏互动开发实践
  20. 文件服务器资源管理器的作用,文件服务器资源管理器 (FSRM) 概述

热门文章

  1. 【Oracle】使用DataGrip连接Oracle数据库
  2. ACM OJ 平台以及平台题目分类
  3. 学计算机需要电脑哪些配置和参数,电脑好不好主要看什么 教你几招看电脑参数和配置...
  4. 【转载】jsDelivr的一些替代方案
  5. ASP.netCore 笔记整理(自用)
  6. python课后习题汇总 (实验9)
  7. 哈夫曼树,二叉树结点个数计算
  8. hexo上传网页无法显示图片的有效解决方法
  9. win10自定义鼠标右键多级菜单(包含桌面)
  10. 教你摆脱“送礼焦虑症”