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

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

  • 1.画树
      • 1.1.生成空白图片
      • 1.2.画出每个结点的位置
      • 1.3.画出结点之间的连线
  • 2.路径序列
      • 2.1.使用路径序列表示二叉树
      • 2.2.生成路径序列
  • 3.使用路径序列生成二叉树图像

在调试一些二叉树相关的算法的时候把树画出来看会比较直观,自己想了一个挺简单直观的方法。
画一颗二叉树分成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函数是指定圆心的所以我们需要计算出每个结点的圆心坐标。
考虑一颗满二叉树。
用C++ OpenCV 来画颗二叉树吧_第1张图片
首先计算纵向也就是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

你可能感兴趣的:(二叉树,opencv,c++)