最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端小算法之二叉树的纵向遍历

    正文概述 掘金(Lipo ?)   2021-01-16   370

    树 是一种经常用到的数据结构,用来模拟具有树状结构性质的数据集合。

    二叉树是一种更为典型的树状结构。如它名字所描述的那样,二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”。


    所谓的纵向遍历二叉树,通常指的是前序遍历、中序遍历、后序遍历。

    下面会介绍这三种遍历中的递归写法与迭代写法。

    迭代写法就是用一个栈来存下每次遍历的左右子节点。

    假设树的定义如下:

     // Definition for a binary tree node.
     function TreeNode(val, left, right) {
        this.val = (val===undefined ? 0 : val)
        this.left = (left===undefined ? null : left)
        this.right = (right===undefined ? null : right)
     }
    

    前序遍历

    前序遍历的顺序就是:根节点 -> 左子节点 -> 右子节点

    那么前序遍历的 递归写法 与 迭代写法 如下:

    // 递归
     var preorderTraversal = functioån(root) {
        let arr = []
        const preNode = (point) => {
            if (point) {
                arr.push(point.val)
                preNode(point.left)
                preNode(point.right)
            }
        }
        preNode(root)
        return arr
     };
     
    // 迭代
    var preorderTraversal = function(root) {
        let arr = []
        let stack = []
        if (root) stack.push(root)
        while (stack.length) {
            let point = stack.pop()
            arr.push(point.val)
    
            if (point.right) stack.push(point.right)
    
            if (point.left) stack.push(point.left)
        }
        return arr
    };
    

    中序遍历

    中序遍历的顺序就是:左子节点 -> 根节点 -> 右子节点

    那么中序遍历的 递归写法 与 迭代写法 如下:

    // 递归
    var inorderTraversal = function(root) {
        let arr = []
        const midRoot = (point) => {
            if (point) {
                midRoot(point.left)
                arr.push(point.val)
                midRoot(point.right)
            }
        }
        midRoot(root)
        return arr
    };
    
    // 迭代
    var inorderTraversal = function(root) {
        let arr = []
        let stack = []
        while(root || stack.length) {
            while (root) {
                stack.push(root)
                root = root.left
            }
            root = stack.pop()
            arr.push(root.val)
            root = root.right
        }
        return arr
    };
    

    后序遍历

    后序遍历的顺序就是:左子节点 -> 右子节点 -> 根节点

    那么后序遍历的 递归写法 与 迭代写法 如下:

    // // 递归
    var postorderTraversal = function(root) {
        let arr = []
        const nextR = (point) => {
            if (point) {
                nextR(point.left)
                nextR(point.right)
                arr.push(point.val)
            }
        }
        nextR(root)
        return arr
    };
    
    // 迭代
    var postorderTraversal = function(root) {
        let arr = []
        let stack = []
        if (root) stack.push([root, false])
        while(stack.length) {
            let point = stack.pop()
            if (point[1]) {
                arr.push(point[0].val)
            } else {
                if (!point[0].left && !point[0].right) {
                    arr.push(point[0].val)
                } else {
                    stack.push([point[0], true])
                }
                if (point[0].right) stack.push([point[0].right, false])
                if (point[0].left) stack.push([point[0].left, false]) 
            }
        }
        return arr
    };
    

    总结

    以上就是二叉树的纵向遍历的几种写法。后续会继续出二叉树的横向遍历的几种常见的场景以及写法。


    起源地下载网 » 前端小算法之二叉树的纵向遍历

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元