我使用下面的代码来获得预订单遍历。我读过pre-order是如何工作的,它以如下顺序遍历二叉树:root left right但我的问题是,为什么这个递归函数可以将输出作为预排序函数里面是怎么工作的?
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"
}
}
}
}
function getListWithDLR() {
var arr=[];
function DLR(obj){
if(obj){
arr.push(obj.name);
DLR(obj.left);
DLR(obj.right);
}
}
DLR(tree);
console.log(arr);
}
getListWithDLR();
输出为:0:“根”
1:“西蒙”
2:“卡尔”
3:“李”
4:“命运”
5:“安妮”
6:“军刀”
7:“托尼”
8:“糖果”
9:“对”
10:“卡尔”
11:“卡尔”
12:“开”
据我所知,应该是这样的:
function DLR(tree){
if(tree){
arr.push(tree.name);
DLR(tree.left); //push the tree.left.name to arr
DLR(tree.right);//push the tree.right.name to arr
}
}
所以在第一次调用函数之后,arr应该像[root,tree.left.name,tree.right.name]但最终的实际输出遵循了预定顺序。
有谁能帮忙解释这个功能背后的规则吗?
最佳答案
事情是这样的:
第一个调用是使用对象树,因此将名称“root”推送到arr,并使用tree再次调用dlr。
在这个调用中,名称“simon”被推送到arr,dlr与simon一起再次调用。
在这个调用中,“Carl”的名称被推到arr,DLR与Carl.left一起再次调用
在这个调用中,“lee”的名称被推到arr,dlr与lee一起再次调用。
在这个调用中,“命运”被推到arr,dlr被再次调用。既然没有命运,不管是左是右,什么都不会发生
现在这是命运的召唤。对,但也没有命运。对,所以什么都没有发生
现在DLR是和李一起打电话的。对,没有,所以什么也没发生。
现在DLR被卡尔呼叫了。对
在这个调用中,“annie”的名称被推到arr,dlr与annie一起被再次调用。
在这个调用中,名字“saber”被推到arr,dlr被用saber.left再次调用。
没有刀。左或刀。右,所以什么都没有发生
现在DLR和Simon一起调用。对
在这个调用中,名称“tony”被推到arr,dlr与tony一起再次调用。
等等…
我想你可以把它概括为做所有的左分支,然后备份到最新的右分支,然后沿着它的左分支,然后再备份到最新的右分支,等等。
关于javascript - 困惑在javascript中实现预遍历时递归函数的顺序如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56815688/