樹的深度優先搜尋(上) 如何才能高效率地查字典?

2022-05-15 18:20:28 字數 1861 閱讀 6213

在平時的生活中,我們查字典都是從單詞的最左邊的字母開始,逐個去查詢。比如查詢「boy」這個單詞,我們一般是這麼查的。首先,在 a~z 這 26 個英文本母裡找到單詞的第乙個字母 b,然後在 b 開頭的單詞裡找到字母 o,最終在 bo 開頭的單詞裡找到字母 y。

字首樹是一種有向樹。那什麼是有向樹?顧名思義,有向樹就是一種樹,特殊的就是,它的邊是有方向的。而樹是沒有簡單迴路的連通圖。

如果乙個圖里所有的邊都是有向邊,那麼這個圖就是有向圖。如果乙個圖里所有的邊都是無向邊,那麼這個圖就是無向圖。既含有向邊,又含無向邊的圖,稱為混合圖。

在有向圖中,以結點 v 為出發點的邊的數量,我們叫作 v 的出度。而以 v 為 終點的邊之數量,稱為 v 的入度。在上圖中,結點 v2 的入度是 1,出度是 2。

結點和邊的交替序列組成的就是通路。所以,通路上的任意兩個結點其實就是互為連通的。如果一條通路的起始點 v_ 和終止點 v_ 相同,這種特殊的通路我們就叫作迴路。從起始點到終止點所經過的邊之數量,就是通路的長度。這裡我畫了一張圖,這裡面有 1 條通路和 1 條迴路,第一條非迴路通路的長度是 3,第二條迴路的長度是 4。

樹是一種特殊的圖,它是沒有簡單迴路的連通無向圖。這裡的簡單迴路,其實就是指,除了第乙個結點和最後乙個結點相同外,其餘結點不重複出現的迴路。

什麼是有向樹呢?顧名思義,有向樹是一種特殊的樹,其中的邊都是有向的,而且它滿足以下幾個條件:

除了這些基本定義,有向樹還有幾個重要的概念,父結點、子結點、兄弟結點、先輩結點、後輩結點、葉子結點、結點的高度(或深度)、樹的高度(或深度)。

如何使用有向樹來實現字首樹:構建字首樹和查詢字首樹。

構建字首樹

查詢字首樹

從字首樹的根開始,查詢下乙個結點,順著這個通路走下去,一直走到到某個結點。如果這個結點及其字首代表了乙個存在的單詞,而待查詢的單詞和這個結點及其字首正好完全匹配,那就說明成功找到了乙個單詞。否則,就表示無法找到。

這裡有幾種特殊情況,需要注意。

構建的時候,我們需要根據當前的字首進行查詢,然後才能找到合適的位置插入新的結點。而且,這兩者都存在乙個不斷重複迭代的查詢過程,我們把這種方式稱為深度優先搜尋(depth first search)。

所謂樹的深度優先搜尋,其實就是從樹中的某個結點出發,沿著和這個結點相連的邊向前走,找到下乙個結點,然後以這種方式不斷地發現新的結點和邊,一直搜尋下去,直到訪問了所有和出發點連通的點、或者滿足某個條件後停止。

二叉樹是每個結點最多有兩個子樹的樹結構,它可用於二叉查詢樹和二叉堆。二叉樹甚至可以用於圖示化我們之前聊過的二分迭代。

滿二叉樹是一棵高度為 n(高度從 1 開始計),且有 2^n-1 個結點的二叉樹。在高度為 k(0

樹搜尋 深度優先和廣度優先

在android開發中,有時候會遇到多層級列表的顯示,如下圖,可用recyclerview實現。其資料來源的資料結構是一種樹狀結構,如下圖 現在有兩種方法來遍歷這種資料結構。深度優先搜尋 其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。舉例說明之 據上圖,我們從...

樹的廣度優先搜尋(BFS),深度優先搜尋 DFS

bfs breadth first search,廣度優先搜尋 dfs depth first search,深度優先搜尋 如圖,a節點的下一級元素為b節點和c節點,b節點的下一級元素為d節點和e節點,c節點的下一級元素為f節點和g節點。bfs優先遍歷當前節點下一級節點的同級元素,即若當前節點為a節...

樹的深度優先搜尋和廣度優先搜尋的實現

depth first search,dfs 可以使用先序遍歷來實現 遞迴版 先序遍歷 public void preorder binarytreenode node 遞迴求樹高 public intmaxdepth treenode root int leftheight maxdepth ro...