二叉树遍历

二叉树遍历四种:前序遍历、中序遍历、后续遍历、层序遍历

前序遍历:线输出当前数据,然后输出左结点, 当左结点输出完成,再输出右结点

解析:先输出当前结点  A  然后输出左结点  B   

所以当前  A B   但此时B仍有左结点,并未输出完成

输出当前结点B,之后输出他的左结点 D

所以当前ABD    但此时D仍有左子结点,并未输出完成,可理解为B也未完成

输出当前结点D,之后输出他的左结点 G,此时D的左结点完全输出完成,可输出他的右结点H

所以当前ABDGH   H输出完成后,整个D输出完成,即B的左结点完全输出完成,无右结点,所以B整个输出完成,即A的左结点完全输出完成,  接下来输出A的右结点C

所以当前ABDGHC  

C之后输出左结点E  但E仍有结点,无左,输出右

ABDGHCEI    此时C的左结点完全输出完成,输出他的右结点F

最终ABDGHCEIF

C#代码如下

private void FirstTraversal(int index)
        {
            if (index >= count) return;
            //得到要遍历的这个结点的编号 
            int number = index + 1;
            if (data[index].Equals(-1)) return;

            Console.Write(data[index]+" ");//-----------先输出当前数据

            //得到左子结点的编号
            int leftNumber = number * 2;
            int rightNumber = number * 2 + 1;
            FirstTraversal(leftNumber - 1);//----------在输出左结点
            FirstTraversal(rightNumber - 1);// ----------最后输出右结点
        }

中序遍历:先遍历完成当前数据的左结点,在遍历当前数据,最后遍历右结点

要输出当前数据A, 但要先输出其左结点B

此时预排序BA    但要输出B,要先输出其左结点D

此时预排序DBA   但要输出D,要先输出其左结点G

此时预排序GDBA    G没有左结点可以真正输出,然后真正输出D,在输出其右结点H

则真排序GDH   B的左结点完全输出,B可输出,但无右结点了

则真排序GDHB  A的左结点完全输出完成,A可以输出,无左结点,要输出右结点C,但是C输出之前要求其左结点E输出完成,E无左结点,可以输出,并输出右结点I,I无左结点,可真正输出

则真排序GDHBEI   此时C的左结点完全输出,C可以输出了,之后输出右结点F,F无左结点,可以真正输出

最后GDHBEICF

C#代码

public void MiddleTraversal()
        {
            MiddleTraversal(0);
        }
        private void MiddleTraversal(int index)
        {
            if (index >= count) return;
            //得到要遍历的这个结点的编号 
            int number = index + 1;
            if (data[index].Equals(-1)) return;
            //得到左子结点的编号
            int leftNumber = number * 2;
            int rightNumber = number * 2 + 1;
            MiddleTraversal(leftNumber - 1);//----------先输出左结点
            Console.Write(data[index] + " ");//---------在输出当前数据
            MiddleTraversal(rightNumber - 1);//----------最后输出右结点
        }

 后序遍历:先遍历完成左结点,在遍历完成右结点,最后输出当前数据

输出当前数据A   前要先依次输出B C

预排序BCA

先看B  输出B之前要先输出 D,D输出之前,要先输出G H   G无左右结点可直接输出,然后输出H,此时G可以输出了

真排序GHD       所以GHDB  到此,A的左结点完全输出完成,,在看C

C输出前要输出E F  

预排序EFC

E输出之前要先输出I  I可直接输出  此时可输出E了,E之后输出F,F无子结点,可直接输出,此时C的左右结点都输出完成,可以输出C了

C的真排序IEFC

连接之后GHDB EFC   此时A的左右结点完全输出完成,A可以输出

最后GHDBIEFCA

C#代码

 public void LastTraversal()
        {
            LastTraversal(0);
        }
        private void LastTraversal(int index)
        {
            if (index >= count) return;
            //得到要遍历的这个结点的编号 
            int number = index + 1;
            if (data[index].Equals(-1)) return;
            //得到左子结点的编号
            int leftNumber = number * 2;
            int rightNumber = number * 2 + 1;
            LastTraversal(leftNumber - 1);//---------先输出左结点
            LastTraversal(rightNumber - 1);//---------在输出右结点
            Console.Write(data[index] + " ");//--------最后输出当前数据
        }

完全代码:

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

namespace 二叉树___顺序结构存储
{
    //如果一个结点是空的话,那么这个结点所在的数组位置,设置为-1,
    class BiTree<T>
    {

        private T[] data;
        private int count = 0;
        public BiTree(int capacity)// 这个参数是当前二叉树的容量,容量就是最多可以存储的数据个数, 数量count代表当前保存了多少个数据
        {
            data = new T[capacity];
        }
        public bool Add(T item)
        {
            if (count >= data.Length)
                return false;
            data[count] = item;
            count++;
            return true;
        }

        public void FirstTraversal()
        {
            FirstTraversal(0);
        }
        private void FirstTraversal(int index)
        {
            if (index >= count) return;
            //得到要遍历的这个结点的编号 
            int number = index + 1;
            if (data[index].Equals(-1)) return;

            Console.Write(data[index]+" ");//-----------先输出当前数据

            //得到左子结点的编号
            int leftNumber = number * 2;
            int rightNumber = number * 2 + 1;
            FirstTraversal(leftNumber - 1);//----------在输出左结点
            FirstTraversal(rightNumber - 1);// ----------最后输出右结点
        }

        public void MiddleTraversal()
        {
            MiddleTraversal(0);
        }
        private void MiddleTraversal(int index)
        {
            if (index >= count) return;
            //得到要遍历的这个结点的编号 
            int number = index + 1;
            if (data[index].Equals(-1)) return;
            //得到左子结点的编号
            int leftNumber = number * 2;
            int rightNumber = number * 2 + 1;
            MiddleTraversal(leftNumber - 1);//----------先输出左结点
            Console.Write(data[index] + " ");//---------在输出当前数据
            MiddleTraversal(rightNumber - 1);//----------最后输出右结点
        }

        public void LastTraversal()
        {
            LastTraversal(0);
        }
        private void LastTraversal(int index)
        {
            if (index >= count) return;
            //得到要遍历的这个结点的编号 
            int number = index + 1;
            if (data[index].Equals(-1)) return;
            //得到左子结点的编号
            int leftNumber = number * 2;
            int rightNumber = number * 2 + 1;
            LastTraversal(leftNumber - 1);//---------先输出左结点
            LastTraversal(rightNumber - 1);//---------在输出右结点
            Console.Write(data[index] + " ");//--------最后输出当前数据
        }

        public void LayerTraversal()
        {
            for (int i = 0; i < count; i++)
            {
                if (data[i].Equals(-1)) continue;
                Console.Write(data[i] + " ");
            }
            Console.WriteLine();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 二叉树___顺序结构存储
{
    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.FirstTraversal();//先序
            Console.WriteLine();
            tree.MiddleTraversal();//中序
            Console.WriteLine();
            tree.LastTraversal();//后序
            Console.WriteLine();
            tree.LayerTraversal();//层序
            Console.ReadKey();
        }
    }
}

输出结果

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值