二叉樹的深度廣度遍歷

2021-07-05 08:35:33 字數 1768 閱讀 7215

深度優先搜尋演算法(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) }

}完整**:/**

* */

#include 

#include 

#include 

#include 

#include 

using

namespace std;

#define element char

#define format "%c"

typedef 

struct node  *tree;

int index = 0;  

//全域性索引變數

//二叉樹構造器,按先序遍歷順序構造二叉樹

//無左子樹或右子樹用'#'表示

void treenodeconstructor(tree &root, element data)

else }

//深度優先遍歷

void depthfirstsearch(tree root)

if(node->lchild) }}//

廣度優先遍歷

void breadthfirstsearch(tree root)

if(node->rchild) }

}/*** 

*/#include "binarytree.h"

int main() ;

tree tree;

treenodeconstructor(tree, data);

printf("深度優先遍歷二叉樹結果: ");

depthfirstsearch(tree);

printf("\n\n廣度優先遍歷二叉樹結果: ");

breadthfirstsearch(tree);

return 0; }

廣度遍歷二叉樹和深度遍歷二叉樹演算法

二叉樹演算法基本和遞迴有關,前中後序演算法就不提了,主要看一下深度優先遍歷和廣度優先遍歷。實現這2種遍歷需要借助棧或者佇列來儲存中間結果,原因是遍歷過程出現了回溯。1 筆試題 廣度遍歷二叉樹 深度遍歷二叉樹 23 include4 include5 include6 7using namespace...

對稱二叉樹 深度遍歷與廣度遍歷

問題 對稱二叉樹 問題描述 給定乙個二叉樹,檢查它是否是映象對稱的。比如,下面這個二叉樹是映象對稱的 1 2 2 3 4 4 3 而這個二叉樹則不是映象對稱的。1 2 2 3 3例子 輸入 1,2,2,3,4,4,3 輸出 true 思路 映象對稱意味著左子樹與右子樹映象對稱,在遍歷左子樹或者右子樹...

二叉樹層次遍歷 廣度遍歷和深度遍歷

問題 二叉樹層次遍歷 問題描述 給定乙個二叉樹,返回其按層次遍歷的節點值。即逐層地,從左到右訪問所有節點 例子 給定二叉樹 3,9,20,null,null,15,7 3 920 157返回其層次遍歷結果 3 9 20 15,7 思路 廣度遍歷和深度遍歷。與一般的廣度遍歷不同的是,每次遍歷都將que...