算法系列09——二叉树概念及遍历

二叉树概念级遍历

  • 做遍历

    • 递归写法
      • 递归序会回到自己三次(来到三次),——递归调用中的三个间隔
      • 在递归序的基础上可以加工出先,中,后序
        • 先序就是递归序中第一次到这个节点时打印
        • 中序就是递归序中第二次到这个节点时打印
        • 后序就是递归序中第三次到这个节点时打印
    • 非递归实现
      • 准备一个栈
      • 先序遍历
        • 先将根节点入栈
        • 每次
          • 从栈中弹出一个节点cur
          • 打印(处理)cur
          • 压栈先右后左(如果有)
      • 后序遍历
        • 需要一个辅助收集栈
        • 根节点入栈
        • 每次
          • 从栈中弹出一个节点cur
          • cur放入收集栈
          • 先左后右压栈
        • 从收集栈依次出栈打印(处理)
      • 中序遍历
        • 每棵子树的整棵树的左边界入栈(左进到空)
        • 依此弹出,打印(处理)
          • 选择右子树(如果有)
          • 整棵树的左边界入栈
          • 依此弹出……
        • 原理:
          • 所有树都是可以用左边界分解掉,实际上一直打印的是左边界
          • 头->左进栈,打印左->头
          • 每一棵树都是先左再头,之后在右子树上做先左再头
  • 可以设置一个负例函数打印二叉树

  • 如何完成二叉树的宽度优先遍历(求一棵二叉树的宽度)

    • 二叉树的先序遍历就是二叉树的深度优先遍历
    • 宽度优先遍历就是使用队列
      • 第一步放入根节点
      • 每次
        • 出队,打印(处理)
        • 先放左再放右
      • java中LinkedList就是队列可以用,add,poll
    • 返回最大宽度,要求知道当前第几层,统计每层的节点个数
      • 准备一张表levelMap记录每个点再第几层
      • 设置变量
        • 当前层
        • 当前层节点数
        • 节点数最多的层号
      • 判断当前点的层号与当前层号
        • 相同,++当前层节点数
        • 不同,设置节点数最多的层号,++当前层号,当前层节点数置1
      • 每个点进队时,进入map,层号=父层号++
    • 不用哈希表只使用队列的方法
      • 设置变量
        • 当前层最后一个节点
        • 下一层最后一个节点
        • 下一层节点数
        • 最大宽度,最宽层号
      • 当前层最后一个节点初始化为根节点
      • 最大宽度初始化为1
      • 最宽层号初始化为1
      • 根节点入队
      • 每次
        • 出队cur
        • 先左后右入队
          • 更新下一层节点数
          • 更新下一层最后一个节点
        • 如果cur等于当前层最后一个节点
          • 更新最宽层号,最大宽度
          • 下一层节点数置0
          • 当前层最后一个节点置为下一层最后一个节点
  • 在二叉树中找到一个后继节点 1:48

    • 后继节点指中序遍历时,一个节点的下一个节点

    • 前驱节点指中序遍历时,一个节点的上一个节点

    • 题目中给定每个节点都有准确指向他父节点的指针

    • 经典二叉树中就是中序遍历所有节点,生成序列,复杂度O(N)

    • 给定父节点指针之后就可以优化

    • 首先明确一个节点的后继节点从树的结构上怎么定义

      • x有右树的时候,后继节点Y是右树上的最左节点

      • x没有右树的时候,不断往上看

        在这里插入图片描述

        • 如果是父亲的右节点则再看上一级父亲
        • 直到当前节点是其父亲的左节点,则该父节点是x的后继节点Y
      • 二叉树总有一个节点没有后继,就是整棵树上最右的节点,向上会找到根节点,没有父亲

  • 二叉树的序列化与反序列化

    • 就是如何将二叉树变成硬盘中的字符串,如何从字符串恢复唯一的树的结构
    • 先序遍历的序列化与反序列化
      • 要用特殊字符表示每一个节点值的结束
      • 要用空指针用特殊的字符表示
      • 反序列化的过程可以先画示意图帮助理解 (递归消费同一个队列)
  • 一个纸条面向自己对折,对折次数为n,求折痕的凹凸顺序

    • 每次对折,都在最新的所有折痕两侧生成两个折痕,上方凹,下方凸

    • 递归的生成效果,可以转化为树

    • 在这里插入图片描述

    • 根节点为‘凹’,每一棵树的左子树的根节点是‘凹’,右子树的根节点是‘凸’,完全二叉树shu

    • 模拟完全二叉树,中序遍历,深度最大为N,只用了O(N)的空间,

    • 如果全部生成好序列,需要的空间是2^N

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值