总所周知,遍历对象的属性用for(x in object)。但是,如果遍历的对象结构是二叉树,这种方法显然不够用了,所以下需要用递归遍历对象查找数据的方法:
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"
}
}
}
}
需求1
// 假设id和name均不会重复,根据输入name找到对应的id
思路:我们是要遍历这一二叉树。
函数将会读取整个对象,利用递归,把函数一层层展开,到最里层直到undefined后终止,然后往下继续读取代码。设置左边和右边的递归,这样每个节点的左边终结后会往下查询右边的对象。最后直到6节点右侧的undefined查完后程序停止跑动。假如输入的名字不存在,没有查到,id返回的是undefined。
假如名字存在,函数会在遍历的过程中匹配到某一个节点的obj.name === name,将该节点id存储到id变量中最后返回。
看不懂上面描述的,可以自己动手用笔在纸上画一画整个树,想象自己是代码,在树上跑的过程 =。=,
function findIdByName(name) {
var id;
function find(obj){
if(obj != null){
if(obj.name === name){
id = obj.id;
}
find(obj.left);
find(obj.right);
}
}
find(tree);
return id;
}
如果你还有点懵逼,也可以采用前序遍历的方式看一下跑的顺序。
我们先创建一个空数组,判断不为空后,将该执行过的对象push进数组。最后打印。
function getListWithDLR() {
//根节点、左子树、右子树
var arr=[];
function DLR(obj){
if(obj){
arr.push(obj.id);
DLR(obj.left);
DLR(obj.right);
}
}
DLR(tree);
console.log(arr);
}