我使用下面的代码来获得预订单遍历。我读过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/

10-11 21:00