版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36718838/article/details/81985504
参考自SIKI学院 C#编程第五季
一、顺序存储
对照图示,截止到J,顺序存储可以发现,左结点是父节点的编号*2,右结点是父节点的编号*2+1。
1.前序遍历
2.中序遍历
3.后序遍历
4.层序遍历
namespace Code5
{
class Program
{
static void Main(string[] args)
{
char[] data = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };
BiTree<char> tree = new BiTree<char>(10);
for (int i=0;i<data.Length;i++)
{
tree.Add(data[i]);
}
tree.PreTraversal();//前序
Console.WriteLine();
tree.InTraversal();//中序
Console.WriteLine();
tree.PostTraversal();//后序
Console.WriteLine();
tree.LayerTravesal();//层序
Console.ReadKey();
}
}
class BiTree<T>
{
private T[] data;
private int count = 0;
public BiTree(int capacity)
{
data = new T[capacity];
}
public bool Add(T item)
{
if (count >= data.Length)
return false;
data[count] = item;
count++;
return true;
}
public void PreTraversal()//公共方法供外部调用
{
PreorderTraversal(0);
}
/// <summary>
/// 前序遍历
/// </summary>
/// <param name="index">遍历结点</param>
void PreorderTraversal(int index)//前序
{
if (index >= count)
return;
if (data[index].Equals(-1))//-1表示结点为空,不输出
return;
int number = index + 1;//结点编号,编号从1开始所以加1
int leftNumber = number * 2;//左孩子编号
int rightNumber = number * 2 + 1;//右孩子编号
Console.Write(data[index]+" ");
PreorderTraversal(leftNumber - 1);//取索引要减1
PreorderTraversal(rightNumber - 1);
}
public void InTraversal()
{
InorderTraversal(0);
}
void InorderTraversal(int index)//中序
{
if (index >= count)
return;
if (data[index].Equals(-1))//-1表示结点为空,不输出
return;
int number = index + 1;//结点编号,编号从1开始所以加1
int leftNumber = number * 2;//左孩子编号
int rightNumber = number * 2 + 1;//右孩子编号
InorderTraversal(leftNumber - 1);
Console.Write(data[index] + " ");
InorderTraversal(rightNumber - 1);
}
public void PostTraversal()
{
PostorderTraversal(0);
}
void PostorderTraversal(int index)
{
if (index >= count)
return;
if (data[index].Equals(-1))//-1表示结点为空,不输出
return;
int number = index + 1;//结点编号,编号从1开始所以加1
int leftNumber = number * 2;//左孩子编号
int rightNumber = number * 2 + 1;//右孩子编号
PostorderTraversal(leftNumber - 1);
PostorderTraversal(rightNumber - 1);
Console.Write(data[index] + " ");
}
public void LayerTravesal()//顺序存储就是层序的放置,直接遍历就可以了。
{
for(int i=0;i<count;i++)
{
if (data[i].Equals(-1))
continue;
Console.Write(data[i] + " ");
}
}
}
}