二叉树的广度优先遍历

需求

给定一颗二叉树,返回它的广度优先遍历(层次遍历)

我们只需要先按照层次遍历创建一颗二叉树,然后遍历将其复原即可

实现

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
let arr = ['a', 'b', 'c', 'd', '#', '#', 'e', '#', 'f', '#', '#', '#', '#']; //给定的序列
function TreeNode(val){
this.val = val;
this.left = null;
this.right = null;
}
function createTree_levelorder(arr){
let rootval = arr.shift();
let queue = [];
if(rootval){
let root = new TreeNode(rootval); //创建根节点
queue.push(root);
while(queue.length){
let node = queue.shift(); //返回头结点
let leftval = arr.shift(); //
let rightval = arr.shift();
if(leftval!=='#'){
let leftnode = new TreeNode(leftval);
queue.push(leftnode);
node.left = leftnode;
}
if(rightval!=='#'){
let rightnode = new TreeNode(rightval);
queue.push(rightnode);
node.right = rightnode;
}
}
return root;
}
}
function bfs(root){
let res = [];
let queue = [];
if(root){
queue.push(root);
res.push(root.val);
while(queue.length){
let node = queue.shift()
if(node.left){
queue.push(node.left);
res.push(node.left.val);
}else{
res.push('#'); //如果是叶子节点
}
if(node.right){
queue.push(node.right);
res.push(node.right.val);
}else{
res.push('#');
}
}
}
return res;
}
let root = createTree_levelorder(arr);
console.log(bfs(root));
//'a', 'b', 'c', 'd', '#', '#', 'e', '#', 'f', '#', '#', '#', '#'
//与形成时的序列相同

二叉树的广度优先遍历
https://blog-theta-ten.vercel.app/2021/08/23/二叉树的广度优先遍历/
作者
Chen
发布于
2021年8月23日
许可协议