數據結構|-完全二叉樹的順序存儲結構的實現


對於一個完全二叉樹,假設它有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();
        }
    }
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM