- 二叉树广度优先遍历,打印时连同行号一起打印;
解题思路:
1.初始化时,last=1,把1放入队列;
2.将1出队,把1的子孩子2,3放入队列,更新nlast=3;
3.nlast更新完之后,打印上一次出队的1,并和last比较,如果相同就打印换行,并更新last=nlast=3;
4.将2出队,把2的子孩子4放入队列,更新nlast=4;
5,nlast更新完以后,打印上一次出队的2,并和last(3)比较,不相同,continue;
6.将3出队,将3的子孩子5,6放入队列,更新nlast=6;
7.nlast更新完以后,打印上一次出队的3,并和last(3)比较, 相同就打印换行,并更新last=nlast=6;
…………
总结就是如下循环:(初始化last=根节点)
1.将A出队,并将A的子孩子入队,更新nlast=A最后入队的子孩子;
2.打印上次出队的家伙A,并和last比较, 如果相同就打印换行,并更新last=nlast,如果 不相同,则continue
接下来我们来代码实现:
首先我们构造二叉树:
var tree = {
value:'1',
left:{
value:'2',
left:{
value:'4',
left:null,
right:null,
},
},
right:{
value:'3',
left: {
value:'5',
left:{
value:'7',
left:null,
right:null,
},
right:{
value:'8',
left:null,
right:null
}
},
right:{
value:'6',
left:null,
right:null
}
}
}
下面是函数:
var wid = function(tree){
if(!tree){
console.log('no tree here');
}
var que = [];
var nlast = 0;
var last = tree.value;
que.push(tree);
while(que!=null){
var node = que.shift();
console.log(node.value);
if(node.left!=null){
que.push(node.left);
nlast = node.left.value;
}
if(node.right!=null){
que.push(node.right);
nlast = node.right.value;
}
if(node.value==last){
console.log('\n');
last=nlast;
}
}
}
wid(tree);
先序遍历序列化
var pre = function(tree){
if(!tree){
console.log('no tree here');
}
console.log(tree.value);
console.log('!')
if(tree.left!=null){
pre(tree.left)
}else{
console.log("#!");
}
if(tree.right!=null){
pre(tree.right);
}else{
console.log('#!');
}
}
pre(tree);