鍍金池/ 問(wèn)答/HTML/ 此二叉樹(shù)的中序遍歷中是如何跳回到callback()處的

此二叉樹(shù)的中序遍歷中是如何跳回到callback()處的

代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>二叉樹(shù)</title>
</head>
<body>
    <script>
        function BinaryTree(){
            var Node = function (key){
                this.key = key;
                this.left = null;
                this.right = null;
            };

            var root= null;

            var insetNode = function(node,newNode){
                if (newNode.key < node.key) {
                    if (node.left === null) {
                        node.left = newNode;
                    } else {
                        insetNode(node.left,newNode);
                    }
                } else{
                    if (node.right ===null) {
                        node.right = newNode;
                    } else{
                        insetNode(node.right,newNode);
                    }
                }
            }

            this.insert = function(key){
                var newNode = new Node(key);
                if (root === null) {
                    root = newNode;
                } else {
                    insetNode(root,newNode);
                }
            };

            var inOrderTraverseNode = function(node,callback){
                if (node !== null) {
                    inOrderTraverseNode(node.left,callback);
                    callback(node.key);
                    inOrderTraverseNode(node.right,callback);
                }
            }

            this.inOrderTraverse = function(callback){
                inOrderTraverseNode(root,callback);
            }
        }

        var nodes = [8,3,10,1,6,14,4,7,13,13];
        var binaryTree = new BinaryTree();
        nodes.forEach(function(key){
            binaryTree.insert(key);
        });

        var callback = function(key){
            console.log(key);
        }

        binaryTree.inOrderTraverse(callback);
    </script>
</body>
</html>

代碼內(nèi)容為二叉樹(shù)的中序遍歷。
在調(diào)試代碼的時(shí)候,斷點(diǎn)設(shè)到44行,然后點(diǎn)擊6次按步執(zhí)行代碼后,此時(shí)nodenull,即key=1節(jié)點(diǎn)的左孩子,因?yàn)椴粷M足node !== null的條件,所以大括號(hào)內(nèi)代碼沒(méi)有執(zhí)行,跳到了49行,到此為止都明白,但是再按步執(zhí)行一次就跳到回46行了,不解,這是怎么實(shí)現(xiàn)的?求指教~謝謝!
樹(shù)結(jié)構(gòu)如下圖:圖片描述

回答
編輯回答
兔寶寶

因?yàn)橹行虮闅v先遍歷左側(cè)的節(jié)點(diǎn),遍歷完后會(huì)執(zhí)行操作,再遍歷右側(cè)節(jié)點(diǎn)。
你觀察到 node 為 null 時(shí),相當(dāng)于 1 左側(cè)的節(jié)點(diǎn)已經(jīng)遍歷完了,也就是inOrderTraverseNode(node.left,callback)這行代碼已經(jīng)執(zhí)行完畢。所以會(huì)執(zhí)行下一行,也就是callback(node.key);

2017年11月5日 23:04
編輯回答
朽鹿

就是一個(gè)遞歸的過(guò)程,在inOrderTraverseNode這個(gè)方法中,每次判斷當(dāng)前節(jié)點(diǎn)是不是null,不是null就接著執(zhí)行inOrderTraverseNode(node.left,callback);,就是遍歷左子樹(shù),一旦遍歷到左子樹(shù)的葉子結(jié)點(diǎn)后一個(gè),此時(shí)就是null了,if里面就不會(huì)就不會(huì)執(zhí)行,就會(huì)跳轉(zhuǎn)到遞歸的上一步,也是就是左子樹(shù)的葉子結(jié)點(diǎn)(null節(jié)點(diǎn)的上一個(gè)),這時(shí)程序是處于if判斷里面的,而inOrderTraverseNode(node.left,callback);這條語(yǔ)句執(zhí)行過(guò)了,所以就執(zhí)行下面一條語(yǔ)句,就是你的callback,輸出key,又執(zhí)行下一條語(yǔ)句inOrderTraverseNode(node.right,callback);,即從右子樹(shù)開(kāi)始中序遍歷。


總結(jié):什么時(shí)候開(kāi)始執(zhí)行callback?

遞歸調(diào)用結(jié)束后,在回溯的時(shí)候調(diào)用callback

2017年6月28日 20:02