干货分享|用一维数组来实现二叉树

createh53周前 (12-06)技术教程18

二叉树的存储方式有许多种,在数据结构中,习惯用链表来表示和实现二叉树结构,这样在删除或增加节点时,会非常方便且具有弹性。当然也可以使用一维数组这样的连续存储空间来表示二叉树,不过在对树的中间节点进行插入与删除时,可能要大量移动数组中的数据来反映树节点的变动。接下来将介绍数组这种存储方法。

用一维数组来实现二叉树

使用有序的一维数组来表示和实现二叉树,可将此二叉树假想成一棵满二叉树,而且第k层具有2k-1个节点,它们按序存放在这个一维数组中。首先来看使用一维数组建立二叉树的方法(见图6-17)以及索引值的设置(见表6-1)。

从图6-17可以看到此一维数组中的索引值有以下关系:

(1)左子树的索引值是父节点的索引值乘以2。

(2)右子树的索引值是父节点的索引值乘以2加1。

接着来看以一维数组建立二叉树的实例,实际上就是建立一棵二叉搜索树,这是一种很好的排序应用模式,因为在建立二叉树的同时数据就经过了初步的比较判断,并按照二叉树的建立规则来存放数据。二叉查找树具有以下特点:

可以是空集合,若不是空集合,则节点上一定要有一个键值。

每一个树根的键值必须大于左子树的键值。

每一个树根的键值必须小于右子树的键值。

左右子树也是二叉查找树。

树的每个节点的键值都不相同。

现在我们示范用一组数据(32, 25, 16, 35, 27)来建立一棵二叉搜索树,具体过程如图6-18所示。

设计一个Java程序,按序输入一棵二叉树节点的数据(6, 3, 5, 9, 7, 8, 4, 2),并建立一棵满二叉树,最后输出存储此二叉树的一维数组。

【范例程序:ch06_01.java】


01//建立二叉树
02
03import java.io.*;
04public    class ch06_01
05{
06  public static void main(String args[]) throws IOException
07  {
08    int i,level;
09    int data[]={6,3,5,9,7,8,4,2}; /*原始数组*/
10    int btree[]=new int[16];
11    for(i=0;i<16;i++) btree[i]=0;
12    System.out.print("原始数组的内容: \n");
13    for(i=0;i<8;i++)
14    System.out.print("["+data[i]+"] ");
15    System.out.println();
16    for(i=0;i<8;i++)/*把原始数组中的值逐一对比*/
17    {
18      for(level=1;btree[level]!=0;)   /*比较树根及数组内的值*/
19      {
20        if(data[i]>btree[level])       /*如果数组内的值大于树根,则往右子树比较*/
21          level=level*2+1;
22        else/*如果数组内的值小于或等于树根,则往左子树比较*/
23          level=level*2;
24      }   /*如果子树节点的值不为0,则再与数组内的值比较一次*/
25      btree[level]=data[i];           /*把数组值放入二叉树*/
26    }
27    System.out.print("二叉树的内容:\n");
28    for (i=1;i<16;i++)
29    System.out.print("["+btree[i]+"] ");
30    System.out.print("\n");
31  }
}

【执行结果】参见图6-19。

一维数组中存放的值和所建立的二叉树对应的关系如图6-20所示。


通常以数组来存储二叉树,如果越接近满二叉树,则越节省存储空间,如果是歪斜树,则最浪费存储空间。另外,要增删数据比较麻烦,必须重新建立二叉树。

本文节选自《图解数据结构 使用Java(视频教学版)》,内容发布获得作者和出版社授权。

相关文章

太厉害了!腾讯T4大牛把《数据结构与算法》讲透了,带源码笔记

话不多说,直接先上图经历过校招的人都知道,算法和数据结构都是不可避免的。在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。在面试(现场...