数据结构-二叉树
二叉树的遍历方式:
顺序存储的二叉树实现:
代码实现:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _013_二叉树 { //如果一个结点时空的话,那么这个结点所在的数组位置,位置为-1 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; return true; } public void FirstTraversal() { FirstTraversal(0); } public void MiddleTraversal() { MiddleTraversal(0); } public void LastTraversal() { LastTraversal(0); } /// <summary> /// 前序遍历 /// </summary> private void FirstTraversal(int index) { if (index >= count) return; //得到要遍历的这个结点的编号 int number = index + 1; if (data[index].Equals( -1)) return; //得到左结点编号 int leftNumber = number * 2; int rightNumber = leftNumber + 1; Console.Write(data[index] + " "); FirstTraversal(leftNumber-1); FirstTraversal(rightNumber-1); } /// <summary> /// 中序遍历 /// </summary> /// <param name="index"></param> private void MiddleTraversal(int index) { if (index >= count) return; //得到要遍历的这个结点的编号 int number = index + 1; if (data[index].Equals(-1)) return; //得到左结点编号 int leftNumber = number * 2; int rightNumber = leftNumber + 1; MiddleTraversal(leftNumber - 1); Console.Write(data[index] + " "); MiddleTraversal(rightNumber - 1); } /// <summary> /// 后序遍历 /// </summary> /// <param name="index"></param> private void LastTraversal(int index) { if (index >= count) return; //得到要遍历的这个结点的编号 int number = index + 1; if (data[index].Equals(-1)) return; //得到左结点编号 int leftNumber = number * 2; int rightNumber = leftNumber + 1; LastTraversal(leftNumber - 1); LastTraversal(rightNumber - 1); Console.Write(data[index] + " "); } /// <summary> /// 层序遍历 /// </summary> public void LayerTraversal() { for (int i = 0; i < count; i++) { if (data[i].Equals(-1)) continue; Console.Write(data[i] + " "); } } } }
测试
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _013_二叉树 { 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>(data.Length); for (int i = 0; i < data.Length; i++) { tree.Add(data[i]); } tree.FirstTraversal(); Console.WriteLine(); tree.MiddleTraversal(); Console.WriteLine(); tree.LastTraversal(); Console.WriteLine(); tree.LayerTraversal(); } } }
顺序存储一般只用于完全二叉树,不然会造成很多空间浪费。