二叉树概念级遍历
-
做遍历
- 递归写法
- 递归序会回到自己三次(来到三次),——递归调用中的三个间隔
- 在递归序的基础上可以加工出先,中,后序
- 先序就是递归序中第一次到这个节点时打印
- 中序就是递归序中第二次到这个节点时打印
- 后序就是递归序中第三次到这个节点时打印
- 非递归实现
- 准备一个栈
- 先序遍历
- 先将根节点入栈
- 每次
- 从栈中弹出一个节点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
-