91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c#如何實現樹的深度優先遍歷

發布時間:2021-09-15 18:04:37 來源:億速云 閱讀:150 作者:小新 欄目:編程語言

這篇文章主要介紹了c#如何實現樹的深度優先遍歷,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

樹的深度優先遍歷

首先,我們定義樹結點:
public class Node
        {
            public Node(long value, bool visited)
            {
                Value = value;
                Visited = visited;
            }

            public long Value { get; set; }//存放結點的值
            public bool Visited { get; set; }
        }

然后,我們就可以愉快地上DFS的棧寫法啦

  public static long Fblc(int n)
        {
            Stack<Node> s = new Stack<Node>();
            s.Push(new Node(n, false));
            long sum = 0;
            long[] childrenResultMemo = new long[n+1];
            childrenResultMemo[0] = 1;
            childrenResultMemo[1] = 1;
            //long children = 0;
            while (s.Any())
            {
                var cur = s.Pop();
             
                    if (cur.Visited == false)
                    {
                        if (childrenResultMemo[cur.Value] == 0)
                        {
                            cur.Visited = true;
                            if (childrenResultMemo[cur.Value - 1] != 0 && childrenResultMemo[cur.Value - 2] != 0)
                            {
                                var result = childrenResultMemo[cur.Value - 1] + childrenResultMemo[cur.Value - 2];
                                childrenResultMemo[cur.Value] = result;
                                sum += result;
                                s.Push(cur);
                            }
                            else
                            {
                                s.Push(cur);
                                s.Push(new Node(cur.Value - 1, false));
                                s.Push(new Node(cur.Value - 2, false));
                            }
                        }
                        else
                        {
                            sum += childrenResultMemo[cur.Value];//保存子樹結果的優化,會有個特殊情況要處理
                        }
                        
                    }
                   
                
            }

            return sum;
        }

上述算法的核心思想是,遍歷棧,pop出棧頂元素,如果已經訪問過(visited為true),就跳過(上面代碼由于采用了保存子樹結果的優化,會有個特殊情況要處理,下文會詳述);否則,將當前父結點的visited標記為true,代表已訪問過,并push到棧;然后將其子結點都push到棧。

如果按照這個思路,寫出來的代碼不會是上面那個樣子的,代碼量少得多也簡潔得多,不過算法復雜度就會像遞歸寫法差不多,因為存在重復計算。

那怎么辦呢,解決辦法只有一個,空間換時間,將子樹的結果存起來,如果對應子樹已經計算過有結果,就不再往下一層的深度遍歷了,直接使用結果。我們將子樹結果保存在了一個數組里面:

long[] childrenResultMemo = new long[n+1];

通常如果子樹已經有結果,按邏輯來說應該就會被訪問過。不過存在特例,就是一開始的子樹0和子樹1:

childrenResultMemo[0] = 1;
childrenResultMemo[1] = 1;

只需在這個特例的分支里面累加結果即可:

sum += childrenResultMemo[cur.Value];

感謝你能夠認真閱讀完這篇文章,希望小編分享的“c#如何實現樹的深度優先遍歷”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芮城县| 旌德县| 克拉玛依市| 马龙县| 双江| 电白县| 洛阳市| 平山县| 贡嘎县| 海安县| 和政县| 金寨县| 香港| 凤庆县| 基隆市| 徐州市| 海安县| 衡山县| 仙居县| 浠水县| 商河县| 沾化县| 桐乡市| 进贤县| 余干县| 资讯| 邵武市| 永吉县| 察哈| 乐山市| 高邮市| 无极县| 宣威市| 栾城县| 梁山县| 麻阳| 洞口县| 平谷区| 安顺市| 明星| 卓资县|