赞
踩
二叉树遍历方式分为三种:先序,中序和后序。
可以以根节点的位置为参考来记遍历方式,在第一个为先序,中间为中序,最后为后序;
即:先序: 根左右;中序:左根右;后序:左右根。
借个图:
之前看过一个视频,关于如何遍历二叉树,只需要围绕二叉树画个轮廓结果就出来了,效果跟此文章类似:https://www.cnblogs.com/shunyu/p/4986288.html
每个节点左上角,底部,右上角分别对应先序,中序,后序时的取值点,以先序为例:
(图画得略丑,见谅。。)
在每个节点左上角做个标识,以根节点左上角为出发点,沿着树路径逆时针画个轮廓,以线先后经过的红点顺序记录节点值。
即为A -> B -> C -> D -> E -> F -> G -> H -> K
对于中序遍历:
以上述方法,即为 B -> D -> C -> A -> E -> H -> G -> K -> F
后序:
即为 D -> C -> B -> H -> K -> G -> F -> E -> A
当然,此方法对于新接触二叉树遍历很是快捷。熟练的话只要抓住遍历顺序规则很快就能得出结果。
JS获取遍历结果:
const data = {
type: 'branch',
value: 'A',
left: {
type: 'branch',
value: 'B',
left: null,
right: {
type: 'branch',
value: 'C',
left: {
type: 'node',
value: 'D',
left: null,
right: null
},
right: null
}
},
right: {
type: 'branch',
value: 'E',
left: null,
right: {
type: 'branch',
value: 'F',
left: {
type: 'branch',
value: 'G',
left: {
type: 'node',
value: 'H',
left: null,
right: null
},
right: {
type: 'node',
value: 'K',
left: null,
right: null
}
},
right: null
}
}
};
// 先序遍历
function preorder(data) {
if (!data) {
return [];
}
if (data.type === 'node') {
return [data.value];
} else {
return [data.value, ...arguments.callee(data.left), ...arguments.callee(data.right)];
}
}
// 中序遍历
function inorder(data) {
if (!data) {
return [];
}
if (data.type === 'node') {
return [data.value];
} else {
return [...arguments.callee(data.left), data.value, ...arguments.callee(data.right)];
}
}
// 后序遍历
function postorder(data) {
if (!data) {
return [];
}
if (data.type === 'node') {
return [data.value];
} else {
return [...arguments.callee(data.left), ...arguments.callee(data.right), data.value,];
}
}
console.log(preorder(data)); // ["A", "B", "C", "D", "E", "F", "G", "H", "K"]
console.log(inorder(data)); // ["B", "D", "C", "A", "E", "H", "G", "K", "F"]
console.log(postorder(data)); // ["D", "C", "B", "H", "K", "G", "F", "E", "A"]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。