最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【力扣】 - 144、94、145、102.二叉树的遍历问题 - 掘金

    正文概述 掘金(全栈冲冲冲)   2021-11-05   577

    DFS(Deep First Search)深度优先搜索 与 BFS(Breath First Search)广度优先搜索

    【力扣】 - 144、94、145、102.二叉树的遍历问题 - 掘金

    二叉树的深度优先

    【力扣】 - 144、94、145、102.二叉树的遍历问题 - 掘金

    二叉树的前序遍历

    二叉树的中序遍历

    二叉树的后序遍历

    (下面解法以中序遍历为例)

    1. 递归

    先判断根节点是否存在,再遍历左节点,最后遍历右节点

    var inorderTraversal = function(root) {
        const res = [];
        const inorder = (root) => {
            if (!root) {
                return;
            }
            inorder(root.left);
            res.push(root.val);
            inorder(root.right);
        }
        inorder(root);
        return res;
    };
    

    2. 迭代

    与方法1类似,区别在于递归时隐式维护一个栈,而在迭代时需要显式地将这个栈模拟出来,其余的实现与细节都相同

    var inorderTraversal = function(root) {
        const res = [];
        const stk = [];
        while (root || stk.length) {
            while (root) {
                stk.push(root);
                root = root.left;
            }
            root = stk.pop();
            res.push(root.val);
            root = root.right;
        }
        return res;
    };
    

    3. Morris 遍历

    1. 如果没有左节点,先将值加入答案数组,再访问右节点,即 x = x.right

    2. 如果有左节点,则找到左节点上最右的节点(即左子树中序遍历的最后一个节点,在中序遍历中的前驱节点),记为 predecessor 。根据 predecessor 的右节点是否为空,进行如下操作:

    • 如果 \textit{predecessor}predecessor 的右节点为空,则将其右节点指向x,然后访问左节点,即 x = x.left

    • 如果 predecessor 的右节点不为空,则此时其右节点指向 x,说明已经遍历完左子树,我们将 predecessor 的右节点置空,将 x 的值加入答案数组,然后访问 x 的右节点,即 x = x.right

    1. 重复上述操作,直至访问完整棵树
    var inorderTraversal = function(root) {
        const res = [];
        let predecessor = null;
    
        while (root) {
            if (root.left) {
                // predecessor 节点就是当前 root 节点向左走一步,然后一直向右走至无法走为止
                predecessor = root.left;
                while (predecessor.right && predecessor.right !== root) {
                    predecessor = predecessor.right;
                }
    
                // 让 predecessor 的右指针指向 root,继续遍历左子树
                if (!predecessor.right) {
                    predecessor.right = root;
                    root = root.left;
                }
                // 说明左子树已经访问完了,我们需要断开链接
                else {
                    res.push(root.val);
                    predecessor.right = null;
                    root = root.right;
                }
            }
            // 如果没有左孩子,则直接访问右孩子
            else {
                res.push(root.val);
                root = root.right;
            }
        }
    
        return res;
    };
    

    二叉树的广度遍历

    二叉树的层序遍历

    var levelOrder = function(root) {
        const ret = [];
        if (!root) {
            return ret;
        }
    
        const q = [];
        q.push(root);
        while (q.length !== 0) {
            const currentLevelSize = q.length;
            ret.push([]);
            for (let i = 1; i <= currentLevelSize; ++i) {
                const node = q.shift();
                ret[ret.length - 1].push(node.val);
                if (node.left) q.push(node.left);
                if (node.right) q.push(node.right);
            }
        }
            
        return ret;
    };
    

    起源地下载网 » 【力扣】 - 144、94、145、102.二叉树的遍历问题 - 掘金

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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