完全二叉树遍历

参考自SIKI学院 C#编程第五季

img

一、顺序存储

对照图示,截止到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 tree = new BiTree(10);
            for (int i=0;i
    {
        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);
        }
        /// 
        /// 前序遍历
        /// 
        /// 遍历结点
        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

 

你可能感兴趣的:(算法)