【JS小白】二叉树的层次遍历
对二叉树遍历的个人思考
数组可以顺序访问或随机访问,但随机起来也是有必要有规律的,比如二分的规律。
链表可以顺序访问,没有额外索引的话,也只能顺序访问。
二叉树这种非线性的结构,无重复地访问一遍的话,首先是可以递归,但是对于递归次数有很大限制。同时,递归访问也只能按照某几种特定的顺序去访问。
然后还可以把二叉树线性化,就可以顺序访问,并且相比递归,有更强的操作性。
想要线性化,就可以搞一个线性的容器,比如数组、栈、队列。栈和队列则可以看作是对这个容器的规范化设定了,统一了容器的操作。
层次遍历二叉树
递归访问二叉树很简洁过瘾,操作过程很亲民容易理解,符合我这非线性的、可能是网络结构的大脑思考方式。
尽管对于计算机底层仍是“线性化处理”了。
伪代码:
tranverse_level(node):
visit(node.value)
tranverse_level(node.left)
。。。有问题
然后发现这是先序遍历,似乎随便调整一下,也无法实现递归的层次遍历。
因为同一层中可能多个结点,一个结点的孩子访问完,只能递归它的孩子,无法回到同级的老远亲戚的结点。
可以用队列。
参考:https://blog.csdn.net/hansionz/article/details/81947834
伪代码:
tranverse(node){
enqueue(node)
while(queue.size()>0):
front=dequeue()
visit(front)
if(front.left):
enqueue(front.left)
if(front.right):
enqueue(front.right)
}
js代码实现
var node = {
value:0,
left:{
value:1,
left:{
value:3,
},
right:{
value:4
}
},
right:{
value:2,
left:{
value:5,
},
right:{
value:6
}
}
}
function tranverse(node){
var q = [node]
while(q.length>0){
var f = q.shift();
console.log(f.value);
if(f.left){
q.push(f.left)
}
if(f.right){
q.push(f.right)
}
}
}
tranverse(node)
复杂情况下的健壮性此处就不去考虑了。
我先记住最核心的内容,剩下的以后再说随机应变吧。