二叉樹的寬度優(yōu)先搜索(層次遍歷,BFS)

二叉樹結(jié)構(gòu):

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

二叉樹寬度優(yōu)先搜索:

按照二叉樹的層數(shù)依次從左到右訪問(wèn)二叉樹的節(jié)點(diǎn);
例如:給定一個(gè)二叉樹:

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1

按照寬度優(yōu)先搜索得到:
第一層根節(jié)點(diǎn):5
第二層從左到右:4->8
第三層從左到右:11->13->4
第四層從左到右:7->2->5->1
最后輸出:5->4->8->11->13->4->7->2->5->1;
ok,接下來(lái)考慮要如何編程實(shí)現(xiàn)這一問(wèn)題:

分析:

遍歷過(guò)程:

  1. 輸入根節(jié)點(diǎn)5;
  2. 依次判斷根節(jié)點(diǎn)5的左節(jié)點(diǎn)和右節(jié)點(diǎn)是否存在:
    左節(jié)點(diǎn)存在,輸入左節(jié)點(diǎn)4;右節(jié)點(diǎn)存在,輸入右節(jié)點(diǎn)8;
    第二層遍歷結(jié)束;
  3. 從左到右遍歷第三層,所以應(yīng)該先判斷節(jié)點(diǎn)4;
    左節(jié)點(diǎn)存在,輸入左節(jié)點(diǎn)11;右節(jié)點(diǎn)不存在;
  4. 繼續(xù)向右遍歷第三層,判斷節(jié)點(diǎn)8;
    左節(jié)點(diǎn)存在,輸入左節(jié)點(diǎn)13;右節(jié)點(diǎn)存在,輸入右節(jié)點(diǎn)4;
    第三層遍歷結(jié)束;
  5. 同上,直到遍歷結(jié)束;
    綜上,我們發(fā)現(xiàn),我們是按照節(jié)點(diǎn)存入的順序來(lái)判斷當(dāng)前節(jié)點(diǎn)的左右節(jié)點(diǎn)是否存在的,先存入的節(jié)點(diǎn)先判斷(先進(jìn)先出),所以我們用隊(duì)列(queue)來(lái)實(shí)現(xiàn)二叉樹的寬度優(yōu)先搜索;

程序設(shè)計(jì):

  1. 隊(duì)列存儲(chǔ)根節(jié)點(diǎn);
  2. 判斷隊(duì)列的頭節(jié)點(diǎn)是否存在左右節(jié)點(diǎn):存在,將節(jié)點(diǎn)加入隊(duì)列中;此時(shí),頭結(jié)點(diǎn)的左右節(jié)點(diǎn)判斷存儲(chǔ)完成,刪除隊(duì)列頭結(jié)點(diǎn);
  3. 同上,當(dāng)隊(duì)列中的所有節(jié)點(diǎn)全部判斷完成時(shí),隊(duì)列為空,遍歷結(jié)束;

程序?qū)崿F(xiàn)(C/C++):

#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    vector<int> rightSideView(TreeNode *root) {
        queue<TreeNode *> q;
        vector<int> result;
        q.push(root);
        while (!q.empty()) {
            if (q.front()->left) {
                q.push(q.front()->left);
            }
            if (q.front()->right) {
                q.push(q.front()->right);
            }
            result.push_back(q.front()->val);
            q.pop();
        }
        return result;
    }
};

int main() {
    TreeNode a(5);
    TreeNode b(4);
    TreeNode c(8);
    TreeNode d(11);
    TreeNode e(13);
    TreeNode f(4);
    TreeNode g(7);
    TreeNode h(2);
    TreeNode i(5);
    TreeNode j(1);
    a.left = &b;
    b.left = &d;
    d.left = &g;
    d.right = &h;
    a.right = &c;
    c.left = &e;
    c.right = &f;
    f.left = &i;
    f.right = &j;
    Solution s;
    vector<int> result;
    result = s.rightSideView(&a);
    for (int i = 0; i < result.size(); i++) {
        printf("%d->", result[i]);
    }
    return 0;
}

結(jié)果:

5->4->8->11->13->4->7->2->5->1->
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上一篇文章講述了樹的概念, 特征以及分類, 旨在讓我們理解什么是樹, 樹的一些常用的概念是什么,樹的分類有哪些等。...
    DevCW閱讀 2,222評(píng)論 4 10
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表,棧,隊(duì)列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,750評(píng)論 1 31
  • 樹的定義 樹(Tree): 是一種無(wú)向圖(undirected graph), 其中任意兩個(gè)頂點(diǎn)間存在唯一一條路徑...
    squall1744閱讀 4,032評(píng)論 1 9
  • 下午的時(shí)候,我參加了一個(gè)聚會(huì),年底的話不管單位各個(gè)團(tuán)隊(duì)都在舉行各種各樣的迎新年晚會(huì)。 聚會(huì)的過(guò)程中,一開始我也沒(méi)有...
    燁然v閱讀 270評(píng)論 1 0
  • 20號(hào),到濱州面試,面試完了太早了,就到處瞎逛,等橘子下班,陳超到濱州,陳大爺不放心我自己逛,就差不多隨時(shí)隨地都在...
    張佳敏閱讀 850評(píng)論 0 0

友情鏈接更多精彩內(nèi)容