二叉树 广度遍历

广度遍历如图

先从1层开始遍历 然后 2 层  , 3层,,,,,,,,,

只需改变一下BinaryTree类

   class BinaryTree
    {
        private BinaryTreeNode _head;//头指针
        private string cStr;//用于构造二叉树的字符串

        public BinaryTreeNode Head//头指针
        {
            get {return _head ;}
        }

        public BinaryTree(string str)
        {
            cStr = str;
            _head = new BinaryTreeNode(cStr[0]);//添加头结点
            ADD(_head,0);//增加孩子结点
        }


        private void ADD(BinaryTreeNode parent,int index)
        {//index 双亲结点的下标

            int leftIndex = 2 * index + 1;//左孩子的下标  
            if (leftIndex<cStr.Length)//存在左孩子
            {
                if (cStr[leftIndex] != '#')//左孩子不是空结点
                {//添加左孩子
                    parent.Left = new BinaryTreeNode(cStr[leftIndex]);

                    //递归方法添加左孩子的左孩子和右孩子
                    ADD(parent.Left,leftIndex);
                }
            }

            int rightIndex = 2 * index + 2;//右孩子的下标
            if (rightIndex<cStr.Length)
            {
                if (cStr[rightIndex]!='#')
                {
                    parent.Right = new BinaryTreeNode(cStr[rightIndex]);
                    ADD(parent.Right, rightIndex);
                }
            }
        }

        public void PreOrder(BinaryTreeNode node)//先序遍历
        {
            
            if (node!=null)//此二叉树不为空树
            {
                Console.Write(node);
                PreOrder(node.Left);
                PreOrder(node.Right);
            }
        }

        public void MidOrder(BinaryTreeNode node) //中序遍历
        {
           
            if (node!=null)
            {
                MidOrder(node.Left);
                Console.Write(node);
                MidOrder(node.Right);
            }
        }

        public void AfterOrder(BinaryTreeNode node) //后序遍历
        {
            
            if (node != null)
            {
                AfterOrder(node.Left);
                AfterOrder(node.Right);
                Console.Write(node);
            }
        }




        //广度优先遍历
        public void LevelOrder()
        {
            
            Queue queue = new Queue();
            queue.Enqueue(_head);

            while (queue.Count>0)//队列不为空
            {
                BinaryTreeNode node = (BinaryTreeNode)queue.Dequeue();//出队
                Console.Write(node);

                if (node.Left!=null)//结点左孩子不为空
                {//左孩子入队
                    queue.Enqueue(node.Left);
                }
                if (node.Right != null)//结点右孩子不为空
                {//右孩子入队
                    queue.Enqueue(node.Right);
                }
            }

        }
    }

调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication13
{
    class Program
    {
        static void Main(string[] args)
        {


            BinaryTree tree = new BinaryTree("ABCDE#F");
            //Console.WriteLine("ABCDE#F 先序遍历的结果为:");
            //tree.PreOrder(tree.Head);//先序遍历输出
            //Console.WriteLine("");

            //Console.WriteLine("ABCDE#F 中序遍历的结果为:");
            //tree.MidOrder(tree.Head);
            //Console.WriteLine("");

            //Console.WriteLine("ABCDE#F 后序遍历的结果为:");
            //tree.AfterOrder(tree.Head);
            //Console.WriteLine("");


            Console.WriteLine("ABCDE#F 广度遍历的结果为:");
            tree.LevelOrder();
            Console.WriteLine("");



            Console.ReadLine();


        }  
    }
}

 

posted @ 2014-07-06 18:29  欢呼雀跃  阅读(281)  评论(0)    收藏  举报