![5f5407e3ef940bc5eab4f11516fa4b43.png](https://img-blog.csdnimg.cn/img_convert/5f5407e3ef940bc5eab4f11516fa4b43.png)
图一:完全二叉树以及对应的数组
![105db2aa0eaf35b708925e5f010d59df.png](https://img-blog.csdnimg.cn/img_convert/105db2aa0eaf35b708925e5f010d59df.png)
图二:满二叉树以及对应的数组
![b320a617737153a88199f46a243515f0.png](https://img-blog.csdnimg.cn/img_convert/b320a617737153a88199f46a243515f0.png)
图三:普通二叉树以及对应的数组 (字符'^'代表空节点)
![aa801963a664d66d8e8296ee9fe98cce.png](https://img-blog.csdnimg.cn/img_convert/aa801963a664d66d8e8296ee9fe98cce.png)
四:我们以这三个二叉树为例,使用C#实现四种遍历
(1)构造一个二叉树顺序结构类
/****************************************************
文件:BiTree.cs
作者:黄山学院--Li Qingshan
邮箱: 2781838262@qq.com
日期:2020/05/19 12:24
功能:
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 二叉树_顺序存储
{
public class BiTree<T>
{
public T[] data;
private int nextIndex = 0;
public BiTree(int length)
{
data = new T[length];
}
public bool Add(T item)
{
if (nextIndex >= data.Length)
{
return false;
}
else
{
data[nextIndex] = item;
nextIndex++;
return true;
}
}
//前序遍历
public void PreorderTraversal(int number)
{
//当下标越界或者当前元素为'^'时此次递归分支终止
if (number > data.Length || data[number - 1].Equals('^'))
{
return;
}
Console.Write(data[number - 1] + " ");
int leftChildNum = number * 2;
PreorderTraversal(leftChildNum);
int rightChildNum = number * 2 + 1;
PreorderTraversal(rightChildNum);
}
//中序遍历
public void MiddleTraversal(int number)
{
//当下标越界或者当前元素为'^'时此次递归分支终止
if (number > data.Length || data[number - 1].Equals('^'))
{
return;
}
int leftChildNum = number * 2;
MiddleTraversal(leftChildNum);
Console.Write(data[number - 1] + " ");
int rightChildNum = number * 2 + 1;
MiddleTraversal(rightChildNum);
}
//后序遍历
public void PostorderTraversal(int number)
{
//当下标越界或者当前元素为'^'时此次递归分支终止
if (number > data.Length || data[number - 1].Equals('^'))
{
return;
}
int leftChildNum = number * 2;
PostorderTraversal(leftChildNum);
int rightChildNum = number * 2 + 1;
PostorderTraversal(rightChildNum);
Console.Write(data[number - 1] + " ");
}
//层序遍历
public void LayerTraversal()
{
for (int i = 0; i < data.Length; i++)
{
//当前元素为'^'时 跳过 执行下一循环
if (data[i].Equals('^'))
{
continue;
}
Console.Write(data[i] + " ");
}
}
}
}
(1)在main方法中定义三上述三树,并调用遍历方法
/****************************************************
文件:Program.cs
作者:黄山学院--Li Qingshan
邮箱: 2781838262@qq.com
日期:2020/05/19 15:49
功能:
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 二叉树_顺序存储
{
class Program
{
static void Main(string[] args)
{
//完全二叉树
//char[] CompleteBinaryTree = new[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };
//满二叉树
//char[] FullBinaryTree = new[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G'};
//普通二叉树
char[] NormalBinaryTree = new[] { 'A', 'B', 'C', 'D', '^', 'F', 'G', '^', 'H', '^', '^', 'I' };
BiTree<char> biTree = new BiTree<char>(NormalBinaryTree.Length);
for (int i = 0; i < NormalBinaryTree.Length; i++)
{
biTree.data[i] = NormalBinaryTree[i];
}
Console.Write("前序遍历: ");
biTree.PreorderTraversal(1);//前序
Console.WriteLine();
Console.Write("中序遍历: ");
biTree.MiddleTraversal(1);//中序
Console.WriteLine();
Console.Write("后序遍历: ");
biTree.PostorderTraversal(1);//后序
Console.WriteLine();
Console.Write("层序遍历: ");
biTree.LayerTraversal();//层序
Console.ReadKey();
}
}
}
(3)以图三二叉树为例,输出结果为:
![64f89c0a742e7f3ae62f9becb423a63a.png](https://img-blog.csdnimg.cn/img_convert/64f89c0a742e7f3ae62f9becb423a63a.png)