什么是二叉树:每个树的节点只有两个子树的树形结构。
为什么使用顺序存储结构:使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号,从而对这些结点进行访问,这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法。
/// <summary> /// 顺序存储二叉树 </summary> public class SequentialStorageBinaryTree<T> { <summary> 用于存储节点的数组 </summary> private T[] data; 节点数 private int count; public SequentialStorageBinaryTree(T[] arr = null) { if (arr == ) data = new T[0]; else data = arr; count = data.Length; } 增加 </summary> <param name="item"></param> bool Add(T item) { List<T> list = data.ToList<T>(); list.Add(item); data = list.ToArray(); count = data.Length; return true; } }
通过数组存储结构为:
1、层次遍历
层次遍历 void LevelTraversal() { for (int i = 0; i < count; i++) { Console.Write(data[i] + " "); } }
2、先序遍历
先序遍历 </summary> <param name="index"></param> void PreorderTraversal(int index =) { //递归的终止条件 if (index >= count || index <) return; int number = index + 1; Console.Write(data[index] + ); int leftIndex = number * 2;做节点 int rightIndex = number * 2 + ; PreorderTraversal(leftIndex - ); PreorderTraversal(rightIndex - ); }
3、中序遍历
中序遍历 void MiddlePrefaceTraversal(int index = if (index >= count || index < ; ; MiddlePrefaceTraversal(leftIndex - ); Console.Write(data[index] + ); MiddlePrefaceTraversal(rightIndex - ); }
4、后续遍历
后序遍历 void AfterwordTraversal(; AfterwordTraversal(leftIndex - ); AfterwordTraversal(rightIndex - ); }
现在我们测试下:
SequentialStorageBinaryTree<string> bTree = new SequentialStorageBinaryTree<string>(); bTree.Add("A); bTree.Add(BCDEFG); 先序遍历 Console.Write(先序遍历:); bTree.PreorderTraversal(); Console.WriteLine(); 中序遍历 Console.Write(中序遍历:); bTree.MiddlePrefaceTraversal(); Console.WriteLine(); 后序遍历:); bTree.AfterwordTraversal(); Console.WriteLine(); 层次遍历 Console.Write(层次遍历:); bTree.LevelTraversal(); Console.ReadKey();
输出: