完全二叉树遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36718838/article/details/81985504

参考自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<char> tree = new BiTree<char>(10);
            for (int i=0;i<data.Length;i++)
            {
                tree.Add(data[i]);
            }
            tree.PreTraversal();//前序
            Console.WriteLine();
            tree.InTraversal();//中序
            Console.WriteLine();
            tree.PostTraversal();//后序
            Console.WriteLine();
            tree.LayerTravesal();//层序
            Console.ReadKey();
        }
        

    }

    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;
            count++;
            return true;
        }

       public void PreTraversal()//公共方法供外部调用
        {
            PreorderTraversal(0);
        }
        /// <summary>
        /// 前序遍历
        /// </summary>
        /// <param name="index">遍历结点</param>
        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<count;i++)
            {
                if (data[i].Equals(-1))
                    continue;
                Console.Write(data[i] + " ");
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36718838/article/details/81985504