用C++ OpenCV 来画颗二叉树吧

本文介绍了如何使用C++和OpenCV来画出二叉树的图像,包括生成空白图片、确定结点位置和画出结点之间的连线。通过层次遍历生成路径序列,并利用路径序列来绘制二叉树,最后展示了绘制二叉搜索树的效果。
摘要由CSDN通过智能技术生成

在调试一些二叉树相关的算法的时候把树画出来看会比较直观,自己想了一个挺简单直观的方法。
画一颗二叉树分成3步
1.构建一颗二叉树
2.生成路径序列
3.根据路径序列画出树
第1步构建二叉树就不说了网上一抓一大把,第2步生成路径序列放在后面讲,先说第3步画树。

1.画树

画树可以分为3个步骤

  1. 生成空白图片作为画布
  2. 画出每个结点的
  3. 画出每个结点之间的连线

1.1.生成空白图片

画图的第一步肯定是要先生成一张空白的图片。这张图片的尺寸需要能够存放下整颗二叉树。
我们知道,一颗高度为h的二叉树最多有 2 h 2^h 2h个叶子结点,需要考虑最极端的情况,也就是一颗满二叉树,因此图片在横向上需要能放下 2 h 2^h 2h个结点,同时纵向是上能够放下 h h h个结点的高度。假设每个结点圆形的直径为 s i z e size size,则图片的尺寸为 [ 2 h ∗ s i z e , ( h + 1 ) ∗ s i z e ] [2^h*size,(h+1)*size] [2hsize,(h+1)size]

cv::Mat pic = 255 - cv::Mat::zeros(cv::Size(pow(2, h) * size, (h + 1) * size), CV_8UC1);

1.2.画出每个结点的位置

为了画出每个结点的位置,我们需要知道每个结点的坐标。opencv的circle函数是指定圆心的所以我们需要计算出每个结点的圆心坐标。
考虑一颗满二叉树。
在这里插入图片描述
首先计算纵向也就是y方向的坐标。这个计算比较简单,高度为 h h h的结点的纵坐标为

y h = ( H − h ) ∗ s i z e + 1 2 ∗ s i z e y_h=(H-h)*size+\frac{1}{2}*size yh=(Hh)size+21size

其中H为整棵树的高度。

接着计算横坐标也就是x方向的坐标。
从高度为0的结点开始。因为 h = 0 h=0 h=0的结点一个挨着一个,因此 h = 0 h=0 h=0的第 n n n个结点的横坐标是

x ( 0 , n ) = n ∗ s i z e + 1 2 ∗ s i z e = 1 ∗ ( n + 1 2 ) ∗ s i z e \begin{aligned} x_{(0,n)}&=n*size+\frac{1}{2}*size\\ &=1*(n+\frac{1}{2})*size \end{aligned} x(0,n)=nsize+21size=1(n+21)size

h = 1 h=1 h=1的结点的横坐标为它的两个子节点的横坐标的平均值

x ( 1 , n ) = ( x ( 0 , 2 n ) + x ( 0 , 2 n + 1 ) ) ∗ 1 2 = 2 ∗ ( n + 1 2 ) ∗ s i z e \begin{aligned} x_{(1,n)}&=(x_{(0,2n)}+x_{(0,2n+1)})*\frac{1}{2}\\ &=2*(n+\frac{1}{2})*size \end{aligned} x(1,n)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值