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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

c/c++

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

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

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

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

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

?

?


如右圖所示的二叉樹(shù):

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

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

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

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

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

深度優(yō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); //先將右子樹(shù)壓棧}if(node->lchild){nodeStack.push(node->lchild); //再將左子樹(shù)壓棧}} }

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

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

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

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

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

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

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

//廣度優(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); //先將左子樹(shù)入隊(duì)}if(node->rchild){nodeQueue.push(node->rchild); //再將右子樹(shù)入隊(duì)}} }

  完整代碼:

/*** <!--* 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; //全局索引變量//二叉樹(shù)構(gòu)造器,按先序遍歷順序構(gòu)造二叉樹(shù) //無(wú)左子樹(shù)或右子樹(shù)用'#'表示 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)建左子樹(shù)treeNodeConstructor(root->rchild, data); //遞歸構(gòu)建右子樹(shù)} }//深度優(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); //先將右子樹(shù)壓棧}if(node->lchild){nodeStack.push(node->lchild); //再將左子樹(shù)壓棧}} }//廣度優(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); //先將左子樹(shù)入隊(duì)}if(node->rchild){nodeQueue.push(node->rchild); //再將右子樹(shù)入隊(duì)}} }

  

/*** <!--* File : BinaryTreeSearch.h* Author : fancy* Email : fancydeepin@yeah.net* Date : 2013-02-03* --!>*/ #include "binarytree.h"int main() {//上圖所示的二叉樹(shù)先序遍歷序列,其中用'#'表示結(jié)點(diǎn)無(wú)左子樹(shù)或無(wú)右子樹(shù)Element data[15] = {'A', 'B', 'D', '#', '#', 'E', '#', '#', 'C', 'F','#', '#', 'G', '#', '#'};Tree tree;treeNodeConstructor(tree, data);printf("深度優(yōu)先遍歷二叉樹(shù)結(jié)果: ");depthFirstSearch(tree);printf("\n\n廣度優(yōu)先遍歷二叉樹(shù)結(jié)果: ");breadthFirstSearch(tree);return 0;}

  

轉(zhuǎn)載于:https://www.cnblogs.com/rednodel/p/7737686.html

總結(jié)

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

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

主站蜘蛛池模板: 国产精品国产一区二区 | 欧美私人网站 | 久久艹久久 | 免费久久久久久 | 男女免费视频网站 | 中文一区在线观看 | 97干在线视频 | 国产一级黄色电影 | 一本无码aⅴ久久久国产 | 国产毛片欧美毛片久久久 | 亚洲色图清纯唯美 | 国产欧美日韩在线视频 | 99re视频在线 | 狠狠撸在线 | 日日骚一区二区 | 欧美图片第一页 | 无码人妻精品一区二区三区9厂 | 成人免费xxxxxx视频 | 欧美日韩少妇 | 久久成人精品一区二区 | 日本国产一区二区 | 色a在线| 在线成人一区 | 国产精品资源 | 丝袜 中出 制服 人妻 美腿 | 久久青娱乐 | 中文字幕免费高清视频 | 日本韩国欧美一区 | 亚洲图片一区二区三区 | 久操视频免费看 | 亚洲射射射| 91视频最新入口 | 国产一区二区网 | 丝袜人妻一区二区三区 | 黄片毛片在线免费观看 | 国产微拍精品 | 在线观看高清av | 性欧美video另类hd尤物 | 手机看片日韩久久 | 免费在线黄色网 | 国产69精品久久久久999小说 | 日韩男女视频 | 欧美色图1| 亚洲国产精品久久精品怡红院 | 91九色pron | 8050午夜一级毛片久久亚洲欧 | 三级黄色免费网站 | h网站在线 | 欧美视频1区 | 伊人久久一区二区 | 久久久国产精品 | 成人做受黄大片 | 国产精品爽爽久久久久久 | 亚洲黄色录像 | 看av网| 在线中文字幕播放 | 欧美二三区 | 女人毛片视频 | 亚洲不卡在线观看 | 亚州国产| 精品国产一二三四区 | 伊人一级| 三级精品在线观看 | 亚洲狼人天堂 | 美女被娇喘流出白 | 黄色高清在线观看 | 国产精品视频免费网站 | 五月天丁香久久 | 97爱爱爱 | 天天骑夜夜操 | 日本在线一本 | 美女国产精品 | 久久精品无码一区二区三区免费 | 中文字幕无码毛片免费看 | 欧美一区三区三区高中清蜜桃 | 日本午夜电影 | 欧美综合社区 | 少妇人妻偷人精品无码视频新浪 | 深爱五月激情五月 | 无人在线观看高清视频 单曲 | 国产性xxx | 国产福利视频一区 | 国产精品一区二区6 | 国产又粗又猛又爽又黄的视频一 | 在线视频网 | 成都电影免费大全 | 国产乱女淫av麻豆国产 | 国产无套在线观看 | 国产一区二区三区视频免费观看 | 欧美日韩一区二区三区四区 | 性盈盈影院中文字幕 | 97在线免费视频 | 影音先锋国产精品 | 丁香亚洲| 欧美日韩亚洲一区 | 深夜视频在线播放 | 日韩欧美国产一区二区在线观看 | 国产精品香蕉国产 | 亚洲性图一区二区 |