日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

矮油~ 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]

發(fā)布時(shí)間:2023/12/15 c/c++ 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 矮油~ 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

深度優(yōu)先搜索算法(Depth First Search),是搜索算法的一種。是沿著樹的深度遍歷樹的節(jié)點(diǎn),盡可能深的搜索樹的分支。

當(dāng)節(jié)點(diǎn)v的所有邊都己被探尋過,搜索將回溯到發(fā)現(xiàn)節(jié)點(diǎn)v的那條邊的起始節(jié)點(diǎn)。這一過程一直進(jìn)行到已發(fā)現(xiàn)從源節(jié)點(diǎn)可達(dá)的所有節(jié)點(diǎn)為止。

如果還存在未被發(fā)現(xiàn)的節(jié)點(diǎn),則選擇其中一個(gè)作為源節(jié)點(diǎn)并重復(fù)以上過程,整個(gè)進(jìn)程反復(fù)進(jìn)行直到所有節(jié)點(diǎn)都被訪問為止。

?

?


如右圖所示的二叉樹:

A 是第一個(gè)訪問的,然后順序是 B、D,然后是 E。接著再是 C、F、G。

那么,怎么樣才能來(lái)保證這個(gè)訪問的順序呢?

分析一下,在遍歷了根結(jié)點(diǎn)后,就開始遍歷左子樹,最后才是右子樹。

因此可以借助堆棧的數(shù)據(jù)結(jié)構(gòu),由于堆棧是后進(jìn)先出的順序,由此可以先將右子樹壓棧,然后再對(duì)左子樹壓棧,

這樣一來(lái),左子樹結(jié)點(diǎn)就存在了棧頂上,因此某結(jié)點(diǎn)的左子樹能在它的右子樹遍歷之前被遍歷。

深度優(yōu)先遍歷代碼片段

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//深度優(yōu)先遍歷

void?depthFirstSearch(Tree root){

????stack<Node *> nodeStack;??//使用C++的STL標(biāo)準(zhǔn)模板庫(kù)

????nodeStack.push(root);

????Node *node;

????while(!nodeStack.empty()){

????????node = nodeStack.top();

????????printf(format, node->data);??//遍歷根結(jié)點(diǎn)

????????nodeStack.pop();

????????if(node->rchild){

????????????nodeStack.push(node->rchild);??//先將右子樹壓棧

????????}

????????if(node->lchild){

????????????nodeStack.push(node->lchild);??//再將左子樹壓棧

????????}

????}

}

  廣度優(yōu)先搜索算法(Breadth First Search),又叫寬度優(yōu)先搜索,或橫向優(yōu)先搜索。

是從根節(jié)點(diǎn)開始,沿著樹的寬度遍歷樹的節(jié)點(diǎn)。如果所有節(jié)點(diǎn)均被訪問,則算法中止。

如右圖所示的二叉樹,A 是第一個(gè)訪問的,然后順序是 B、C,然后再是 D、E、F、G。

那么,怎樣才能來(lái)保證這個(gè)訪問的順序呢?

借助隊(duì)列數(shù)據(jù)結(jié)構(gòu),由于隊(duì)列是先進(jìn)先出的順序,因此可以先將左子樹入隊(duì),然后再將右子樹入隊(duì)。

這樣一來(lái),左子樹結(jié)點(diǎn)就存在隊(duì)頭,可以先被訪問到。

廣度優(yōu)先遍歷代碼片段

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//廣度優(yōu)先遍歷

void?breadthFirstSearch(Tree root){

????queue<Node *> nodeQueue;??//使用C++的STL標(biāo)準(zhǔn)模板庫(kù)

????nodeQueue.push(root);

????Node *node;

????while(!nodeQueue.empty()){

????????node = nodeQueue.front();

????????nodeQueue.pop();

????????printf(format, node->data);

????????if(node->lchild){

????????????nodeQueue.push(node->lchild);??//先將左子樹入隊(duì)

????????}

????????if(node->rchild){

????????????nodeQueue.push(node->rchild);??//再將右子樹入隊(duì)

????????}

????}

}

  完整代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

/**

?* <!--

?* File?? : binarytree.h

?* Author : fancy

?* Email? : fancydeepin@yeah.net

?* Date?? : 2013-02-03

?* --!>

?*/

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <Stack>

#include <Queue>

using?namespace?std;

#define Element char

#define format "%c"

?

typedef?struct?Node {

????Element data;

????struct?Node *lchild;

????struct?Node *rchild;

} *Tree;

?

int?index = 0;??//全局索引變量

?

//二叉樹構(gòu)造器,按先序遍歷順序構(gòu)造二叉樹

//無(wú)左子樹或右子樹用'#'表示

void?treeNodeConstructor(Tree &root, Element data[]){

????Element e = data[index++];

????if(e ==?'#'){

????????root = NULL;

????}else{

????????root = (Node *)malloc(sizeof(Node));

????????root->data = e;

????????treeNodeConstructor(root->lchild, data);??//遞歸構(gòu)建左子樹

????????treeNodeConstructor(root->rchild, data);??//遞歸構(gòu)建右子樹

????}

}

?

//深度優(yōu)先遍歷

void?depthFirstSearch(Tree root){

????stack<Node *> nodeStack;??//使用C++的STL標(biāo)準(zhǔn)模板庫(kù)

????nodeStack.push(root);

????Node *node;

????while(!nodeStack.empty()){

????????node = nodeStack.top();

????????printf(format, node->data);??//遍歷根結(jié)點(diǎn)

????????nodeStack.pop();

????????if(node->rchild){

????????????nodeStack.push(node->rchild);??//先將右子樹壓棧

????????}

????????if(node->lchild){

????????????nodeStack.push(node->lchild);??//再將左子樹壓棧

????????}

????}

}

?

//廣度優(yōu)先遍歷

void?breadthFirstSearch(Tree root){

????queue<Node *> nodeQueue;??//使用C++的STL標(biāo)準(zhǔn)模板庫(kù)

????nodeQueue.push(root);

????Node *node;

????while(!nodeQueue.empty()){

????????node = nodeQueue.front();

????????nodeQueue.pop();

????????printf(format, node->data);

????????if(node->lchild){

????????????nodeQueue.push(node->lchild);??//先將左子樹入隊(duì)

????????}

????????if(node->rchild){

????????????nodeQueue.push(node->rchild);??//再將右子樹入隊(duì)

????????}

????}

}

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/**

?* <!--

?* File?? : BinaryTreeSearch.h

?* Author : fancy

?* Email? : fancydeepin@yeah.net

?* Date?? : 2013-02-03

?* --!>

?*/

#include "binarytree.h"

?

int?main() {

?

????//上圖所示的二叉樹先序遍歷序列,其中用'#'表示結(jié)點(diǎn)無(wú)左子樹或無(wú)右子樹

????Element data[15] = {'A',?'B',?'D',?'#',?'#',?'E',?'#',?'#',?'C',?'F','#',?'#',?'G',?'#',?'#'};

????Tree tree;

????treeNodeConstructor(tree, data);

????printf("深度優(yōu)先遍歷二叉樹結(jié)果: ");

????depthFirstSearch(tree);

????printf("\n\n廣度優(yōu)先遍歷二叉樹結(jié)果: ");

????breadthFirstSearch(tree);

????return?0;

?

}

https://www.cnblogs.com/rednodel/p/7737686.html?

總結(jié)

以上是生活随笔為你收集整理的矮油~ 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。