C++20行代码画的二叉树
这是一个基于递归思想实现的二叉树可视化程序,使用自定义的 Sprite 类模拟海龟绘图(Turtle Graphics)。通过不断分割任务规模(length, level)构建出一棵具有动态样式变化的分形树。
关键代码逐行解读
void draw_tree(float length,int level){ if(level==0)return; //递归终止 rocket.pensize(level*2).color(330-level*20); rocket.pd().fd(length).pu().left(30); //落笔前进抬笔左转30 if(level<5)rocket.dot(2); draw_tree(length*3/4.0,level-1);//画左子树 rocket.right(70); //右转70度 draw_tree(length*7/10.0,level-1);//画右子树 rocket.left(40); //左转40度 rocket.bk(length); //回到起点 }
二叉树特性总结
| 维度 | 表现特征 |
|---|---|
| 拓扑结构 | ✅ 严格二叉树:每个非叶节点均有且仅有两个子节点 |
| 生长规则 | 🌿 异构分裂:左支取原长75%,右支取原长70% → 形成天然不对称形态 |
| 视觉风格 | 🎨 双重渐变体系:① 线条粗细随深度线性增长 ② 色调从暖橙向玫红过渡 |
| 细节点缀 | 🔴 阶段性标记:前5层末端添加直径2px红点 → 强化浅层节点辨识度 |
| 空间布局 | 🔍 精密回溯机制:每次递归结束后精确退回起点 → 确保多级嵌套时的坐标系稳定 |
执行流程推演
-
初始化阶段 (
main()):- 创建黑色背景画布 (800×800px)
- 预设角色属性:抬笔状态、零速运行(实时渲染)、禁用拖尾效果
- 初始定位:向北偏转90°(垂直向上)后退200px → 建立合适的绘图起点
-
首次调用:
draw_tree(150, 15)→ 最长主干达150px,共发育15代子孙- 由此触发深度优先遍历:始终优先处理左子树直至底层,再折返处理右子树
-
典型截面示例 (第N层):
├─ 层级level N: 线宽=2N, 颜色≈(330-20N)° │ ├─ 左孩子树: len=parent×0.75, level=N-1 │ └─ 右孩子树: len=parent×0.7, level=N-1
下面是这树画的所有代码:
#include "sprites.h" //包含C++精灵库 Sprite rocket; //建立角色叫rocket void draw_tree(float length,int level){ if(level==0)return; //递归终止 rocket.pensize(level*2).color(330-level*20); rocket.pd().fd(length).pu().left(30); //落笔前进抬笔左转30 if(level<5)rocket.dot(2); draw_tree(length*3/4.0,level-1);//画左子树 rocket.right(70); //右转70度 draw_tree(length*7/10.0,level-1);//画右子树 rocket.left(40); //左转40度 rocket.bk(length); //回到起点 } int main(){ //主功能块 rocket.bgcolor("black").setup(800,800); rocket.pu().speed(0).delay(0); rocket.left(90).bk(200).tracer(0); draw_tree(150,15); rocket.update(); rocket.hide().done(); return 0; }
最终呈现效果
这将生成一株高度失衡却富有生命力的数字植物:
- 形态特征:左侧枝干粗壮修长(保留更多原始长度),右侧纤细短小 → 类似真实树木受光照影响的趋光性生长
- 色彩韵律:顶端炽热如熔岩(橙红色),基底冷峻似紫檀(绛紫色)→ 创造冷暖交替的视觉节奏
- 空间张力:通过差异化缩放比例形成的对抗性构图 → 既有数学严谨性又不失艺术美感
此实现巧妙融合了计算机科学中的递归算法与传统书画艺术的空间经营理念,堪称算法美学的经典范例。
下面是发在抖音号里pxcoding的视频:https://www.douyin.com/video/7592797358035979571

浙公网安备 33010602011771号