用一维数组构建不完全二叉树

Posted 娜驿站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用一维数组构建不完全二叉树相关的知识,希望对你有一定的参考价值。

前言

在刷leetcode中的题目时,经常会出现利用二叉树解题的情况,但leetcode给出的只是一个一维数组,而且这个一维数组是按照二叉树的水平层级排列,比如给出一个一维数组为:[1,2,3,4,5,null,6,7,null,null,null,null,8],它对应的二叉树如下图所示:

leetcode 内置了将这种一维数组转换为二叉树的函数,但我们自己在测试程序的过程中,并没有现成的转换函数帮我们实现这种转换,这一篇来研究一下 leetcode 中的这种内置转换函数是怎么编写的。

实现一维数组到二叉树的转换

如果一个一维数组中所有的元素构成的二叉树恰好是满二叉树,则第i个元素与第2i+12i+2个元素构成父子节点,但当一个一维数组中的元素无法构成满二叉树时,我们需要对其每个元素进行判断,比如leetcode给出的null元素,就意味着该元素对应的节点是个空节点,这个空节点当然不会再拥有子节点,因此,此时由该一维数组构成的二叉树不能再以2i+12i+2的规律来寻找其子节点。
下面我们给出由一维数组创建二叉树的函数:

用一维数组构建不完全二叉树

用一维数组构建不完全二叉树

用一维数组构建不完全二叉树

测试代码如下:
用一维数组构建不完全二叉树
上述代码得到的node变量即是二叉树的根节点。

二叉树的前序遍历

为了能看到二叉树是否已经成功构成,我们用前序遍历来查看一下各节点的值:

用一维数组构建不完全二叉树

熟悉前序遍历的同学可以将上述结果与 前言 部分的图进行比对,看是否正确。

将二叉树打印成二维图形

下面代码演示了如何将上述二叉树打印成横向的二维图形,这个二维图形的最左边是二叉树的顶点,最上面是二叉树的右分支,最下面是二叉树的左分支:

用一维数组构建不完全二叉树

用一维数组构建不完全二叉树

从上图可以看出,它实际上相当于当原二叉树向左旋转了90度,那么能不能在屏幕上垂直打印出二叉树呢? 答案是肯定的。

将二叉树转换为二维数组

其实垂直打印思路也很简单,先将二叉树转换为二维数组,代码如下:

用一维数组构建不完全二叉树

用一维数组构建不完全二叉树

二维数组已经转换好了,从上述输出结果可以看出,这个数组与前面打印的二维图形是一一对应的。 下面将其顺时针旋转90度。

将二叉树按垂直方式打印

为了旋转一个数组,我们用numpy的数组转置功能,但我们只是想将数组顺时针旋转90度,所以在转置之前,先将大数组反向排列一下:

用一维数组构建不完全二叉树

用一维数组构建不完全二叉树

从上述输出,可以看出我们已经重新将二叉树按水平方向打印出来了,借助于typora软件的mermaid绘图代码,我们可以直接将上述图形生成绘图代码,来展示出本文一开始的图形。

将二叉树生成绘图代码

Typora在本公众号之前有介绍过,它是markdown格式的所见即所得编辑器,也是我最喜欢的文字编辑器之一,为了利用其mermaid绘图功能,用Python来自动生成相关代码如下:

用一维数组构建不完全二叉树

用一维数组构建不完全二叉树

将上述文本复制到 Typora 中,即可得到 前言 中所列图形:

用一维数组构建不完全二叉树

测试
下面我们再来用一个数组测试一下这些函数:

用一维数组构建不完全二叉树

将上述mermaid代码复制到typora中可得图形:

有兴趣的同学可以对照原数组检查一下。

小结

本文对一维数组转换二叉树、二叉树转换为二维数组、二叉树的左右、上下打印等方法进行了研究,在此记录以备忘。

以上是关于用一维数组构建不完全二叉树的主要内容,如果未能解决你的问题,请参考以下文章

大话数据结构(十五)——二叉树的理论知识

已知一棵完全二叉树存放于一个一维数组T[n]中,T[n]中存放的是各结点的值。试设计一个算法,从T[0]开始顺序读出各结点的值,建立该二叉树的二叉链表表示。

数据结构(二十二)二叉树的顺序存储结构

折半查找的二叉判定树是否完全二叉树?为啥?

完全二叉树 数组存储 层次构造

堆排序(最小堆)