二叉樹的深度優先遍歷和廣度優先遍歷

2021-06-29 13:07:13 字數 952 閱讀 7883

深度優先搜尋演算法(depth first search),是搜尋演算法的一種。是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。

當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。

如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止。

如右圖所示的二叉樹:

a 是第乙個訪問的,然後順序是 b、d,然後是 e。接著再是 c、f、g。

那麼,怎麼樣才能來保證這個訪問的順序呢?

分析一下,在遍歷了根結點後,就開始遍歷左子樹,最後才是右子樹。

因此可以借助堆疊的資料結構,由於堆疊是後進先出的順序,由此可以先將右子樹壓棧,然後再對左子樹壓棧,

這樣一來,左子樹結點就存在了棧頂上,因此某結點的左子樹能在它的右子樹遍歷之前被遍歷。

深度優先遍歷**片段

//深度優先遍歷

void

depthfirstsearch(tree root)

if(node

->

lchild)}}

廣度優先搜尋演算法(breadth first search),又叫寬度優先搜尋,或橫向優先搜尋。

是從根節點開始,沿著樹的寬度遍歷樹的節點。如果所有節點均被訪問,則演算法中止。

如右圖所示的二叉樹,a 是第乙個訪問的,然後順序是 b、c,然後再是 d、e、f、g。

那麼,怎樣才能來保證這個訪問的順序呢?

借助佇列資料結構,由於佇列是先進先出的順序,因此可以先將左子樹入隊,然後再將右子樹入隊。

這樣一來,左子樹結點就存在隊頭,可以先被訪問到。

廣度優先遍歷**片段

//廣度優先遍歷

void

breadthfirstsearch(tree root)

if(node

->

rchild)}}

二叉樹的深度優先遍歷和廣度優先遍歷

深度優先搜尋演算法 depth first search 是搜尋演算法的一種。是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源...

二叉樹的深度優先遍歷和廣度優先遍歷

深度優先搜尋演算法 depth first search 是搜尋演算法的一種。是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源...

二叉樹的深度優先遍歷和廣度優先遍歷

深度優先遍歷 棧,先壓右節點,再壓左節點 也就深入的遍歷,沿著每乙個分支直到走到最後,然後才返回來遍歷剩餘的節點。二叉樹不同於圖,圖需要標記節點是否已經訪問過,因為可能會存在環,而二叉樹不會出現環,所以不需要標記。那麼,我們只需要乙個棧空間,來壓棧就好了。因為深度優先遍歷,遍歷了根節點後,就開始遍歷...