算法與數據結構基礎 - 深度優先搜索(DFS)

DFS基礎css

深度優先搜索(Depth First Search)是一種搜索思路,相比廣度優先搜索(BFS),DFS對每個分枝路徑深刻到不能再深刻爲止,其應用於樹/圖的遍歷、嵌套關係處理、回溯等,能夠用遞歸、堆棧(stack)實現DFS過程。html

 

關於廣度優先搜索(BFS)詳見:算法與數據結構基礎 - 廣度優先搜索(BFS)node

關於遞歸(Recursion)詳見:算法與數據結構基礎 - 遞歸(Recursion)git

 

樹的遍歷github

DFS經常使用於二叉樹的遍歷,關於二叉樹詳見:算法

算法與數據結構基礎 - 二叉查找樹(Binary Search Tree)express

算法與數據結構基礎 - 二叉樹(Binary Tree)數據結構

 

相關LeetCode題:dom

559. Maximum Depth of N-ary Tree  題解ide

897. Increasing Order Search Tree  題解

872. Leaf-Similar Trees  題解

108. Convert Sorted Array to Binary Search Tree  題解

100. Same Tree  題解

257. Binary Tree Paths  題解

101. Symmetric Tree  題解

110. Balanced Binary Tree  題解

112. Path Sum  題解

111. Minimum Depth of Binary Tree  題解

979. Distribute Coins in Binary Tree  題解

366. Find Leaves of Binary Tree  題解

1123. Lowest Common Ancestor of Deepest Leaves  題解

1110. Delete Nodes And Return Forest  題解

1026. Maximum Difference Between Node and Ancestor  題解

515. Find Largest Value in Each Tree Row  題解

199. Binary Tree Right Side View  題解

1145. Binary Tree Coloring Game  題解

337. House Robber III  題解

863. All Nodes Distance K in Binary Tree  題解

114. Flatten Binary Tree to Linked List  題解

971. Flip Binary Tree To Match Preorder Traversal  題解

105. Construct Binary Tree from Preorder and Inorder Traversal  題解

109. Convert Sorted List to Binary Search Tree  題解

116. Populating Next Right Pointers in Each Node  題解

124. Binary Tree Maximum Path Sum  題解

99. Recover Binary Search Tree  題解

968. Binary Tree Cameras  題解

 

圖的遍歷

樹可視做一類特殊的圖,更通常地DFS用於圖的遍歷,可視化過程 

關於圖詳見:算法與數據結構基礎 - 圖(Graph)

 

相關LeetCode題:

733. Flood Fill  題解

841. Keys and Rooms  題解

695. Max Area of Island  題解

531. Lonely Pixel I  題解 

756. Pyramid Transition Matrix  題解

694. Number of Distinct Islands  題解

711. Number of Distinct Islands II  題解

638. Shopping Offers  題解

851. Loud and Rich  題解

802. Find Eventual Safe States  題解

785. Is Graph Bipartite?  題解

200. Number of Islands  題解

1034. Coloring A Border  題解

332. Reconstruct Itinerary  題解

329. Longest Increasing Path in a Matrix  題解

834. Sum of Distances in Tree  題解

499. The Maze III  題解

 

嵌套關係處理

DFS可用於形如 "3[a2[c]]" 存在嵌套關係的問題處理,例如 LeetCode題目394. Decode String:

    // 394. Decode String
    string decode(string s,int& pos){
        string res="";
        int num=0;
        for(;pos<s.length();pos++){
            if(s[pos]=='['){
                string tmp=decode(s,++pos);
                for(;num>0;num--) res+=tmp;
            }
            else if(s[pos]>='0'&&s[pos]<='9')
                num=num*10+s[pos]-'0';
                else if(s[pos]==']') return res;
                else
                    res+=s[pos];
        }
        return res;
    }

以上經過DFS進入到最內層的 '[ ]',以後隨着函數返回、由內向外層層展開。

 

相關LeetCode題:

394. Decode String  題解

690. Employee Importance  題解

339. Nested List Weight Sum  題解

1020. Number of Enclaves  題解

 

DFS與回溯

回溯(Backtracking)算法中選擇一條路徑並走到底的思路,正是DFS。DFS是構成回溯算法的一部分。

關於回溯詳見:算法與數據結構基礎 - 回溯(Backtracking)

 

相關LeetCode題:

494. Target Sum  題解

473. Matchsticks to Square  題解 

980. Unique Paths III  題解

301. Remove Invalid Parentheses  題解 

 

DFS與Memorization

和BFS過程同樣,應用DFS時也有可能重複訪問同一節點,這時可用Memorization記錄哪些節點已經訪問過,避免路徑重複遍歷。

 

相關LeetCode題:

851. Loud and Rich  題解

547. Friend Circles  題解

490. The Maze  題解

1059. All Paths from Source Lead to Destination  題解

934. Shortest Bridge  題解

489. Robot Room Cleaner  題解

753. Cracking the Safe  題解

749. Contain Virus  題解

514. Freedom Trail  題解

546. Remove Boxes  題解

相關文章
相關標籤/搜索