原 特别遍历树

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

namespace TreeTest
{
    class Program
    {
        static List<Connect<Letter>>  letter = new List<Connect<Letter>>();
        static void Main(string[] args)
        {
            Init();
            List<Connect<Letter>> tt = Find("A");
            Stack<Letter> st = new Stack<Letter>();
            Search(st, tt.ElementAt(0).Item1);
            List < Letter > s=st.Reverse<Letter>().ToList<Letter>();
            Console.WriteLine("******************************");
            s.ForEach((o) => { o.write(); });
        }
        /// <summary>
        /// 递归搜索树
        /// </summary>
        /// <param name="st"></param>
        /// <param name="t"></param>
        static void Search(Stack<Letter> st, Letter t)
        {
            List<Connect<Letter>> fs = Fathers(t);
            List<Connect<Letter>> cs = Children(t);
            if (fs.Count > 0)
            {//有父亲 
                //查看是否存在未读取的父亲
                bool allread = isAllRead(fs);
                if (!allread)
                {
                    foreach (Connect<Letter> tt in fs)
                    {//迭代父节点
                        if (tt.Item1.IsRead == false)
                        {
                            Search(st, tt.Item1);
                        }
                    }
                }
                else
                {//父亲已经全部读取
                    if (!st.Contains(t))
                    {
                        t.write();
                        st.Push(t);
                    }
                }
            }
            else
            {//无父亲 入栈
                if (!st.Contains(t))
                {
                    t.write();
                    st.Push(t);
                }
            }

            if (cs.Count > 0)
            {
                //有孩子 遍历孩子
                foreach (Connect<Letter> tt in cs)
                {//迭代父节点
                    if(tt.Item2.IsRead==false)
                    Search(st, tt.Item2);
                }
            }
            else
            {//无孩子 结束迭代
                return;
            }
        }
        static Boolean isAllRead(List<Connect<Letter>>  tt)
        {
            foreach (Connect<Letter> t in tt)
            {//迭代父节点
                if (t.Item1.IsRead == false)
                {
                    return false;
                }
            }
            return true;
        }
        static void Init()
        {
            Letter A = new Letter("A");
            Letter B = new Letter("B");
            Letter C = new Letter("C");
            Letter D = new Letter("D");
            Letter E = new Letter("E");
            Letter F = new Letter("F");
            Letter G = new Letter("G");
            Letter H = new Letter("H");
            Letter I = new Letter("I");
            Letter J = new Letter("J");
            Letter K = new Letter("K");
            Letter L = new Letter("L");
            Letter M = new Letter("M");
            Letter N = new Letter("N");
            Letter O = new Letter("O");
            Letter P = new Letter("P");
            Letter Q = new Letter("Q");
            Letter R = new Letter("R");


            letter.Add(new Connect<Letter>(A, B));
            letter.Add(new Connect<Letter>(C, B));
            letter.Add(new Connect<Letter>(B, D));
            letter.Add(new Connect<Letter>(I,H));
            letter.Add(new Connect<Letter>(J, H));
            letter.Add(new Connect<Letter>(H, D));
            letter.Add(new Connect<Letter>(F, E));
            letter.Add(new Connect<Letter>(G,E));
            letter.Add(new Connect<Letter>(E, D));
            letter.Add(new Connect<Letter>(D, K));

            letter.Add(new Connect<Letter>(K, L));
            letter.Add(new Connect<Letter>(L,M));
            letter.Add(new Connect<Letter>(L, N));
            letter.Add(new Connect<Letter>(K, P));
            letter.Add(new Connect<Letter>(P,Q));
            letter.Add(new Connect<Letter>(P, R));
        }
        /// <summary>
        /// 寻找起始节点
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        static List<Connect<Letter>> Find(string s)
        {
            List<Connect<Letter>> tt = new List<Connect<Letter>>();
            foreach (Connect<Letter> t in letter)
            {
                if (t.Item1.Word== s)
                {
                    tt.Add(t);
                }
            }
            return tt;
        }
        /// <summary>
        /// 寻找所有父节点链接
        /// </summary>
        /// <param name="l"></param>
        /// <returns></returns>
        static List<Connect<Letter>> Fathers(Letter l)
        {
            List<Connect<Letter>> tt = new List<Connect<Letter>>();
            foreach (Connect<Letter> t in letter)
            {
                if (t.Item2 == l)
                {
                    tt.Add(t);
                }
            }
            return tt;
        }
       /// <summary>
       /// 寻找所有子节点链接
       /// </summary>
       /// <param name="l"></param>
       /// <returns></returns>
        static List<Connect<Letter>> Children(Letter l)
        {
            List<Connect<Letter>> tt = new List<Connect<Letter>>();
            foreach (Connect<Letter> t in letter)
            {
                if (t.Item1 == l)
                {
                    tt.Add(t);
                }
            }
            return tt;
        }
    }
    public class Letter
    {
        private string _word;
        private Boolean _isRead;
        public string Word
        {
            get { return _word; }
            set { _word = value; }
        }
        public Boolean IsRead
        {
            get { return _isRead; }
            set { _isRead = value; }
        }
        public Letter(string v)
        {
            this._word = v;
            _isRead = false;
        }

        public void write() { Console.WriteLine(_word); _isRead = true; }
    }
    class Connect<T> where T :class
    {
        public T Item1 { get; set; }
        public T Item2 { get; set; }
        public Connect(T t1, T t2)
        {
            Item1 = t1;
            Item2 = t2;
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏领域驱动设计DDD实战进阶

领域驱动设计案例之仓储顶层实现

3255
来自专栏跟着阿笨一起玩NET

NPOI简述与运用

最近想把项目中Excel中的操作部分改成NPOI ,由于2.0版本已经支持office07/10格式,但还处于测试版不稳定,于是封装如下代码

1031
来自专栏张善友的专栏

.NET 4 System.Threading.CountdownEvent

在Visual Studio 2010 and .NET Framework 4 Training Kit中有个System.Threading.Countdo...

1808
来自专栏电光石火

C#解析JSON

使用开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/)。下载后添加dll引用就能用。 首先添加引用:us...

3565
来自专栏电光石火

C#解析JSON

使用开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/)。下载后添加dll引用就能用。 首先添加引用:usin...

2879
来自专栏跟着阿笨一起玩NET

动态调用WebService

http://linglong117.blog.163.com/blog/static/277145472009127514463/

1791
来自专栏菩提树下的杨过

温故而知新:WinForm/Silverlight多线程编程中如何更新UI控件的值

单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如...

2295
来自专栏游戏杂谈

使用ScriptableObject创建.asset文件

定义为public的变量就存储在xxx.asset中,通过 CommonConfig.Instance.Get 直接获取数据。

1195
来自专栏跟着阿笨一起玩NET

使用dynamic来简化反射实现,并且提高了性能。

本人转载:http://www.cnblogs.com/cuitsl/archive/2012/01/06/2314636.html

1411
来自专栏草根专栏

asp.net web api 2.2 基础框架(带例子)

简介 这个是我自己编写的asp.net web api 2.2的基础框架,使用了Entity Framework 6.2(beta)作为ORM。 该模板主要采用...

5359

扫码关注云+社区