Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

    • 102.二叉树的层序遍历
    • 103.二叉树的锯齿形层序遍历
    • 124.二叉树中的最大路径和
    • 236.二叉树的最近公共祖先
    • 105.从前序与中序遍历序列构造二叉树
    • 662.二叉树最大宽度
    • 1080. 根到叶路径上的不足节点
    • 101. 对称二叉树
    • 226. 翻转二叉树
    • 114. 二叉树展开为链表
    • 1110. 删点成林
    • 337. 打家劫舍 III
    • 979. 在二叉树中分配硬币
    • 222. 完全二叉树的节点个数
    • 513. 找树左下角的值
    • 968. 监控二叉树
    • 剑指offer34
    • 剑指 Offer 32 - III. 从上到下打印二叉树 III
    • 剑指 Offer 33. 二叉搜索树的后序遍历序列
    • 线索二叉树

      • 94.二叉树中序遍历
      • 144.二叉树的前序遍历
    • 二叉搜索树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 二叉树
  • 线索二叉树
phan
2023-05-16

94.二叉树中序遍历

# 94.二叉树中序遍历

  1. 栈实现:要注意外层while循环跳出条件,要考虑到树只有右子树的情况。空间O(n)

      while(!stack.isEmpty()||curr!=null)//有左子树栈不为空或者只有右子树
         {
             while(curr!=null)
             {
                 stack.push(curr);
                 curr=curr.left;
             }
             curr=stack.pop();
             res.add(curr.val);
             curr=curr.right;
         }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  2. 线索二叉树:比较复杂,假设curr为当前遍历到的节点,分几种情况:

    • 如果没有左孩子,那么访问当前节点,开始遍历右子树,curr=curr.right

    • 如果有左子树,那么在左子树中找到curr的前驱节点pre。

      (pre=curr.left; while(pre.right!=null&&pre.right!=curr) pre=pre.right;),这时候根据pre.right的情况(如果不分情况,只进行前驱节点指向curr操作,curr=curr.left,会导致后面curr的左子树访问完回到curr时,会继续访问左子树,无法判断左子树是处于还没进行访问,开始连接前驱节点的状态还是已经访问完毕的状态)由分为两种操作:

      • 若pre.right=null,则连接前驱,pre.right=curr;然后开始遍历左子树curr=curr.left。
      • 若pre.right=curr,则说明当前是已经访问完左子树,第二次回到curr节点的状态,这时候就访问当前节点curr,然后开始遍历右子树curr=curr.right。这里断不断开连接对后续操作没有影响。

    每个节点被访问两次,时间复杂度O(2n)=O(n),空间复杂度O(1)。

编辑 (opens new window)
#Leetcode#二叉树#线索二叉树
上次更新: 2023/12/15, 15:49:57
剑指 Offer 33. 二叉搜索树的后序遍历序列
144.二叉树的前序遍历

← 剑指 Offer 33. 二叉搜索树的后序遍历序列 144.二叉树的前序遍历→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式