后序遍历是先遍历它的左右子树在遍历父节点,
主要用栈实现(先进后出)
例如一个树的对象:
const tree = [
{
id: 1,
name: '张三',
children: [
{
id: 2,
name: '李四',
children: [
{
id: 5,
name: '张五'
}
]
}
]
},
{
id: 6,
name: '玛丽'
}
]
后序遍历的非递归方式实现,出栈时需要判定它是否是叶子节点还有它的左右子树是否遍历完,当左右子树入栈时,同时把左右子树删除,出栈的判定方式是左右子树都不存在,这样的方式上述出栈的两种情况的判别条件就变成了一种,更加容易实现
function treeMap(tree){
if(typeof tree !== "object"){
return null;
}
array.push(tree[1]);
array.push(tree[0]);
while(array.length > 0){
let curNode = array[array.length - 1];
if(!curNode.children || curNode.children.length === 0){
console.log(curNode.id,curNode.name);
array.pop();
}else{
if(curNode.children[1]){
array.push(curNode.children[1]);
curNode.children.splice(1,1);
}
if(curNode.children[0]){
array.push(curNode.children[0]);
curNode.children.splice(0,1);
}
}
}
}
treeMap(tree);