课程分类

课程介绍
课程目录
用户评论
课程介绍
课程目录
用户评论

你将获得

  • 深入理解morris遍历

教学服务

  • icon

    录播课程

讲师介绍

  • 16年java开发经验,10的架构经验,曾就职于当当等大型互联网企业。熟练掌握分布式、高并发、高可用等技术。掌握支付平台、理财业务等业务架构。

  • 多年的前端经验,曾就职与国内某大型电商网站,曾为大自然家居等国内外企业客户服务,为多家企业独立担当网站前端页面搭建工作。 授课气氛轻松有趣易懂,思路严谨逻辑性强,让知识点深入浅出,注重理论与案例结合促进学生吸收。可针对学生学习情况开发课程,备受学生称赞与喜欢。

  • 老师讲课真心很负责,能照顾到所有听课同学,而且课堂上有问题也会耐心的讲解,

  • 老师是位算法大师,redis,实现了很多算法,通过算法建立模型,然后通过语言实现相应的应用。计算机本来就是数学的具体实现

  • 课程详情





    基本概念
    Morris 遍历:时间复杂度O(N)、额外空间复杂度O(1),N 为二叉树的节点个数。

    说明:和二叉树的遍历有关的最优解都是Morris 遍历。



    分析:
    Morris 遍历:对于有左子树的节点current,会遍历到两次,否则只会遍历到一次。对于有左子树的节点,它会先让左子树的最右节点 rightmost指向它,从而达到之后能从底层节点返回上层。



    如果 rightmost的右指针为空,说明是第一次到达current,然后会让它指向current;

    如果 rightmost的右指针指向current ,说明这是第二次到达current,current的左子树已经遍历完了,该回到current,开始遍历其右子树了。

    具体步骤:


    1、如果current 无左子树,current 向右移动【遍历其右子树】【无左子树,current 只会经过一次】;



    2、如果current 有左子树,找到current 左子树上最右的节点 rightmost:



    2.1、若 rightmost的右指针指向null【说明这是第一次来到current 】,让 rightmost的右指针指向current 【那么之后就可以通过该指针返回current 了】,current 向左移动【遍历左子树】;



    2.2、若 rightmost的右指针指向的是current 【说明这是第二次来到current,current 的左子树已经遍历完了】,让 rightmost的右指针指向空,current 向右移动。



    说明:

    传统的二叉树遍历要么是自己实现一个栈要么借助系统栈作为辅助空间,都是为了解决底层节点怎么回到最上层。Morris 遍历利用特殊节点的指针解决了这一个问题,因此比较省空间。

    核心 代码


    private static void morris(Node node){
    Node current = node,rightmost = null;
    while(current != null){
    rightmost = current.left;
    if(rightmost != null){
    while(rightmost.right != null && rightmost.right != current)
    rightmost = rightmost.right;
    if(rightmost.right == null){
    rightmost.right = current;
    current = current.left;
    continue;
    }else rightmost.right = null;
    }
    current = current.right;
    }
    }

    温馨提示
    • 请勿私下交易
      请勿在平台外交易。与机构和老师私下交易造成的任何损失及纠纷,腾讯课堂不承担任何责任
    • 听课说明

      1、电脑:访问腾讯课堂官网 ke.qq.com 查看我的课表或下载win/mac客户端听课

      2、手机/平板:下载腾讯课堂APP, 进入学习页面听课