二叉樹結(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ò)程:
- 輸入根節(jié)點(diǎn)5;
- 依次判斷根節(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é)束; - 從左到右遍歷第三層,所以應(yīng)該先判斷節(jié)點(diǎn)4;
左節(jié)點(diǎn)存在,輸入左節(jié)點(diǎn)11;右節(jié)點(diǎn)不存在; - 繼續(xù)向右遍歷第三層,判斷節(jié)點(diǎn)8;
左節(jié)點(diǎn)存在,輸入左節(jié)點(diǎn)13;右節(jié)點(diǎn)存在,輸入右節(jié)點(diǎn)4;
第三層遍歷結(jié)束; - 同上,直到遍歷結(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ì):
- 隊(duì)列存儲(chǔ)根節(jié)點(diǎn);
- 判斷隊(duì)列的頭節(jié)點(diǎn)是否存在左右節(jié)點(diǎn):存在,將節(jié)點(diǎn)加入隊(duì)列中;此時(shí),頭結(jié)點(diǎn)的左右節(jié)點(diǎn)判斷存儲(chǔ)完成,刪除隊(duì)列頭結(jié)點(diǎn);
- 同上,當(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->