所谓二叉树的遍历,是指按照一定的顺序对二叉树的每一个节点均访问一次,且只访问一次。
按照访问根节点的访问位置不同通常把二叉树的遍历分为三种方式:
前序遍历、中序遍历、后序遍历
手画的图。。有点丑见谅
一、前序遍历
首先访问根节点,然后访问根节点的左子树,在访问根节点的右子树。
遍历结果:abdefgc
function DLR(tree){
console.log(tree.value);
if(tree.left){
DLR(tree.left);
}
if(tree.right){
DLR(tree.right);
}
}
二、中序遍历
首先访问根节点的左子树,然后访问根节点,再访问根节点右子树
遍历结果: debgfac
function LDR(tree){
if(tree.left){
LDR(tree.left);
}
console.log(tree.value);
if(tree.right){
LDR(tree.right);
}
}
三、后序遍历
首先访问根节点的左子树,然后访问根节点的右子树,最后访问根节点
遍历结果:edgfbca
function LRD(tree){
if(tree.left){
LRD(tree.left);
}
if(tree.right){
LRD(tree.right);
}
console.log(tree.value);
}
下面来看一个实例:
var tree = {
"id": 0,
"name": "root",
"left": {
"id": 1,
"name": "Simon",
"left": {
"id": 3,
"name": "Carl",
"left": {
"id": 7,
"name": "Lee",
"left": {
"id": 11,
"name": "Fate"
}
},
"right": {
"id": 8,
"name": "Annie",
"left": {
"id": 12,
"name": "Saber"
}
}
},
"right": {
"id": 4,
"name": "Tony",
"left": {
"id": 9,
"name": "Candy"
}
}
},
"right": {
"id": 2,
"name": "right",
"left": {
"id": 5,
"name": "Carl",
},
"right": {
"id": 6,
"name": "Carl",
"right": {
"id": 10,
"name": "Kai"
}
}
}
}
// 把这个对象中所有的名字以“前序遍历”的方式全部输出到console中
function getListWithDLR(obj) {
console.log(obj.id);
if(obj.left){
getListWithDLR(obj.left);
}
if(obj.right){
getListWithDLR(obj.right);
}
}
console.log("前序遍历:");
getListWithDLR(tree);
// 把这个对象中所有的名字以“中序遍历”的方式全部输出到console中
function getListWithLDR(obj) {
if(obj.left){
getListWithLDR(obj.left);
}
console.log(obj.id);
if(obj.right){
getListWithLDR(obj.right);
}
}
console.log("中序遍历:");
getListWithLDR(tree);
// 把这个对象中所有的名字以“后序遍历”的方式全部输出到console中
function getListWithLRD(obj) {
if(obj.left){
getListWithLRD(obj.left);
}
if(obj.right){
getListWithLRD(obj.right);
}
console.log(obj.id);
}
console.log("后序遍历:");
getListWithLRD(tree);
三种遍历的操作其实大致相同,而起差异就在于执行额外操作的时机,例如console.log