對於一個完全二叉樹,假設它有n個結點,對結點進行從1開始編號,對任一結點i滿足下面
- 它的雙親是結點 i/2 (除了i=1的情況)
- 左孩子是 2i 右孩子是 2i+1
- 如果2i>n 說明無左孩子 2i+1>n 說明無右孩子
一般的樹來說是一對多的關系,使用順序結構存儲起來比較困難,但是二叉樹是一種特殊的樹,每個結點最多有兩個子節點,並且子節點有左右之分,並且兄弟,父親,孩子可以很方便的通過編號得到,所以我們使用順序存儲結構使用二叉樹的存儲。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestFun3 { class Program { static void Main(string[] args) { BiTree<string> tree = new BiTree<string>(16); tree.Add("A"); tree.Add("B"); tree.Add("C"); tree.Add("D"); tree.Add("E"); tree.Add("F"); tree.Add("G"); tree.Add("H"); tree.Add("I"); tree.Add("J"); tree.PreTravelsal(); Console.WriteLine(); tree.InorderTraversal(); Console.WriteLine(); tree.PostTraversal(); Console.WriteLine(); tree.LevelTraversal(); Console.WriteLine(); Console.ReadKey(); } } /// <summary> /// 二叉樹的順序存儲結構 /// </summary> /// <typeparam name="T"></typeparam> class BiTree<T> { private T[] data;//二叉樹的數據 private int count;//二叉樹結點個數 /// <summary> /// 創建二叉樹 /// </summary> /// <param name="capcity">二叉樹容量</param> public BiTree(int capcity) { //指定二叉樹的容量(順序存儲結構都必須事先指定存儲容量) data = new T[capcity]; } /// <summary> /// 添加結點元素 /// </summary> /// <param name="item">元素</param> /// <returns>返回false表示二叉樹容量已滿,添加失敗</returns> public bool Add(T item) { //首先做安全校驗 if (count >= data.Length) return false; data[count] = item; count++; return true; } //前序遍歷 public void PreTravelsal() { PreTravelsal(0); } public void PreTravelsal(int index) { if (index >= count) return; //二叉樹中的結點編號是index+1 int number = index + 1; Console.Write(data[index] + "--"); //找到當前結點的左子樹 PreTravelsal(number * 2 - 1); //找到當前結點的右子樹 PreTravelsal(number * 2 + 1 - 1); } //中序遍歷 public void InorderTraversal() { InorderTraversal(0); } public void InorderTraversal(int index) { if (index >= count) return; int number = index + 1; InorderTraversal(number * 2 - 1); Console.Write(data[index] + "--"); InorderTraversal(number * 2 + 1 - 1); } //后序遍歷 public void PostTraversal() { PostTraversal(0); } public void PostTraversal(int index) { if (index >= count) return; int number = index + 1; PostTraversal(number * 2 - 1); PostTraversal(number * 2 + 1 - 1); Console.Write(data[index] + "--"); } //層序遍歷 public void LevelTraversal() { for (int i = 0; i < count; i++) { Console.Write(data[i]+"--"); } Console.WriteLine(); } } }