数据结构之树(二叉树的遍历)

215 阅读2分钟

这是我参与更文挑战的第27天,活动详情查看:更文挑战

先序遍历

先序遍历是以优先于后代节点的顺序访问每个节点。 先序遍历的一种应用是打印一个结构化的文档。

function BinarySearchTree () {
    // 初始化根节点为null
    let root = null
    // 声明节点Node类,用于创建多个独立的节点
    let Node = function (key) {
        this.key = key
        this.left = null
        this.right = null
    }
    
    this.preOrderTraverse = function (callback) {
        preOrderTraverseNode(root, callback)
    }
    let preOrderTraverseNode = function (node, callback) {
        if(node) {
            callback(node.key)
            preOrderTraverseNode(node.left, callback)
            preOrderTraverseNode(node.right, callback)
        }
    }
    
}

先序遍历是先访问节点本身,然后再访问它的左侧子节点,最后再访问右侧子节点。 调用先序遍历之后依次返回的节点值如下: 11 7 5 3 6 9 8 10 15 13 12 14 20 18 25

后序遍历

后序遍历是先访问节点的后代节点,再访问节点本身。后序遍历的一种应用是计算一个目录和它的子目录中所有文件所占空间的大小。 具体实现代码如下:

function BinarySearchTree () {
    // 初始化根节点为null
    let root = null
    // 声明节点Node类,用于创建多个独立的节点
    let Node = function (key) {
        this.key = key
        this.left = null
        this.right = null
    }
    
    this.postOrderTraverse = function (callback) {
        postOrderTraverseNode(root, callback)
    }
    let postOrderTraverseNode = function (node, callback) {
        if(node) {
            postOrderTraverseNode(node.left, callback)
            postOrderTraverseNode(node.right, callback)
            callback(node.key)
        }
    }
    
}

后序遍历会先访问左侧子节点,然后访问右侧子节点,最后是父节点本身。 调用后序遍历方法,最终的打印结果如下:3 6 5 8 10 9 7 12 14 13 18 25 20 15 11

总结

二叉树的前序遍历,中序遍历,后序遍历是面试中常常考察的基本算法,那么到此如果还有不理解的伙伴,可以去查看 LeetCode的解释

三个遍历顺序可以理解为:先 中 后 这三个词是针对根节点的访问顺序而言的,即先序就是根节点在最前根->左->右,中序是根节点在中间左->根->右,后序是根节点在最后左->右->根。 我们从上述代码中调用遍历方法的输出结果也不难得出这个结论(11是根节点)。

三种遍历方法的实现在此处都是采用了最简单的递归调用来实现。