现有树形结构数据:
const Tree={
pid:'',id:0,children:[
{pid:0,id:1,children:[
{pid:1,id:4,children:[{pid:4,id:10}]},
{pid:1,id:5},
]},
{pid:0,id:2,children:[
{pid:2,id:6},
{pid:2,id:7,children:[{pid:7,id:11}]},
]},
{pid:0,id:3,children:[
{pid:3,id:8},
{pid:3,id:9,children:[{pid:9,id:12}]},
]},
]
}
数据映射的树形图如下:
先序遍历:根左右。此时上面数据的输出为:
0,1,4,10,5,2,6,7,11,3,8,9,12
代码实现:
function preOrderTraverse(rnode) {
console.log(rnode.id)
if(rnode.children){
for(let v of rnode.children){
preOrderTraverse(v)
}
}
}
preOrderTraverse(Tree)
中序遍历:左根右。此时上面数据的输出为:
10,4,1,5,0,6,2,11,7,8,3,12,9
代码实现:
function midOrderTraverse(rnode) {
if(rnode.children&&rnode.children[0]) midOrderTraverse(rnode.children[0])
console.log(rnode.id)
if(rnode.children&&rnode.children.length>1){
for(let i=0;i<rnode.children.length;i++){
if(i!=0)
midOrderTraverse(rnode.children[i])
}
}
}
midOrderTraverse(Tree)
后序遍历:左右根。此时上面数据的输出为:
10,4,5,1,6,11,7,2,8,12,9,3,0
代码实现:
function nextOrderTraverse(rnode){
if(rnode.children){
for(let v of rnode.children){
nextOrderTraverse(v)
}
}
console.log(rnode.id)
}
nextOrderTraverse(Tree)
层序遍历:逐层从左到右。此时上面数据的输出为:
0,1,2,3,4,5,6,7,8,9,10,11,12
代码实现:
function levelOrderTraverse(Tree) {
const res=[]
const levelNodes=[Tree]
while(levelNodes.length){
const temp=[],count=levelNodes.length
for(let i=0;i<count;i++){
const node=levelNodes.shift()
temp.push(node.id)
if(node.children) levelNodes.push(...node.children)
}
res.push(...temp)
}
return res
}
console.log(levelOrderTraverse(Tree))