二叉树的层序遍历
Xilong Yang

对之前的文章:二叉树的存储结构及其非层序遍历的一点小补充。

原理

使用一个队列来对每个节点进行入队-加入子节点-访问-出队的操作即可,非常简单。

伪码表示:

1
2
3
4
5
6
7
8
9
输入:待访问的二叉树Tree
输出:对节点的层序访问
View:
queue.push Tree
while !queue.empty:
if (Tree.left) queue.push Tree.left
if (Tree.right) queue.push Tree.right
Tree.show
queue.pop

C++实现

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
#include <iostream>
#include <queue>

using namespace std;

// 简单实现一个二叉树
struct Tree {
Tree() : left(nullptr), data(0), right(nullptr) {}
Tree *left;
char data;
Tree *right;
};

// 层序遍历
void View(const Tree &T) {
queue<Tree> nodeQueue;
nodeQueue.push(T);
while (!nodeQueue.empty()) {
auto cur = nodeQueue.front();
if (cur.left) nodeQueue.push(*cur.left);
if (cur.right) nodeQueue.push(*cur.right);
nodeQueue.pop();
cout << cur.data;
}
cout << endl;
}

Haskell实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 二叉树
data Tree = Empty | Node Tree String Tree
deriving (Eq, Show)

-- 将树转变为层序遍历序列
view :: Tree -> String
view = view'.view''
where
-- 将一个树的列表转变为对应的值的列表
view' :: [Tree] -> String
view' [] = ""
view' ((Node _ str _):xs) = str ++ view' xs
-- 将一个树转变为其层序遍历的列表
view'' :: Tree -> [Tree]
view'' Empty = []
view'' t = extend [t] 0
where
extend :: [Tree] -> Int -> [Tree]
extend ts n = if(n >= length ts) then ts
else case (ts!!n) of
(Node left _ right) -> extend (ts
++ (if (left == Empty) then [] else [left])
++ (if (right == Empty) then [] else [right]))
(n + 1)

Haskell学艺不精,写得挺丑,留待日后优化吧。