度優先搜尋演算法(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)}}
完整**:/**
* element data;
struct
node
*lchild;
struct
node
*rchild;} *
tree;
intindex =0
; //
全域性索引變數
//二叉樹構造器,按先序遍歷順序構造二叉樹
//無左子樹或右子樹用'#'表示
void
treenodeconstructor(tree
&root, element data)
else}//
深度優先遍歷
void
depthfirstsearch(tree root)
if(node
->
lchild)}}
//廣度優先遍歷
void
breadthfirstsearch(tree root)
if(node
->
rchild)}}
/*** //
上圖所示的二叉樹先序遍歷序列,其中用'#'表示結點無左子樹或無右子樹
element data[
15] =;
tree tree;
treenodeconstructor(tree, data);
printf(
"深度優先遍歷二叉樹結果: ");
depthfirstsearch(tree);
printf(
"\n\n廣度優先遍歷二叉樹結果: ");
breadthfirstsearch(tree);
return0;
}
廣度遍歷二叉樹和深度遍歷二叉樹演算法
二叉樹演算法基本和遞迴有關,前中後序演算法就不提了,主要看一下深度優先遍歷和廣度優先遍歷。實現這2種遍歷需要借助棧或者佇列來儲存中間結果,原因是遍歷過程出現了回溯。1 筆試題 廣度遍歷二叉樹 深度遍歷二叉樹 23 include4 include5 include6 7using namespace...
深度和廣度優先搜尋演算法
在社交網路中,有乙個六度分割理論,具體是說,世界上任何互不相識的兩人,平均只需要六步就能夠建立起聯絡。乙個使用者的一度連線使用者就是他的好友,二度連線使用者就是他好友的好友,三度連線使用者就是他好友好友的好友。給定乙個使用者,如何找出這個使用者的所有三度 包括一度 二度和三度 好友關係呢?我們知道,...
Python 二叉樹的廣度優先搜尋和深度優先搜尋
二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用於實現二叉查詢樹和二叉堆。1 2 3 4 5 6 7 先定義乙個二叉樹的節點類 class treenode def init self,x self.val...