此二叉树的中序遍历中是如何跳回到callback()处的

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>二叉树</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>

代码内容为二叉树的中序遍历。
在调试代码的时候,断点设到44行,然后点击6次按步执行代码后,此时nodenull,即key=1节点的左孩子,因为不满足node !== null的条件,所以大括号内代码没有执行,跳到了49行,到此为止都明白,但是再按步执行一次就跳到回46行了,不解,这是怎么实现的?求指教~谢谢!
树结构如下图:图片描述

阅读 2.2k
2 个回答

因为中序遍历先遍历左侧的节点,遍历完后会执行操作,再遍历右侧节点。
你观察到 node 为 null 时,相当于 1 左侧的节点已经遍历完了,也就是inOrderTraverseNode(node.left,callback)这行代码已经执行完毕。所以会执行下一行,也就是callback(node.key);

就是一个递归的过程,在inOrderTraverseNode这个方法中,每次判断当前节点是不是null,不是null就接着执行inOrderTraverseNode(node.left,callback);,就是遍历左子树,一旦遍历到左子树的叶子结点后一个,此时就是null了,if里面就不会就不会执行,就会跳转到递归的上一步,也是就是左子树的叶子结点(null节点的上一个),这时程序是处于if判断里面的,而inOrderTraverseNode(node.left,callback);这条语句执行过了,所以就执行下面一条语句,就是你的callback,输出key,又执行下一条语句inOrderTraverseNode(node.right,callback);,即从右子树开始中序遍历。


总结:什么时候开始执行callback?

递归调用结束后,在回溯的时候调用callback

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题