“从0开始做LeetCode”之二叉树进阶
1+2.morris遍历
经典遍历:额外空间复杂度:O(h),因为要回到上级节点,压栈,这个栈可以是递归,也可以自己写
递归版过程:
有左子树,能来到它两次,没有左子树,只能来到它一次
在morris遍历中改先序,中序,后序:难
先序:
中序:
后序:
只关注能够来到两次的节点,在第二次来到该节点时候,逆序打印左子树右边界,最后单独打印一下整棵树右边界
3.平衡搜索二叉树
中序遍历,升序
前驱节点,后继节点
对比hash_map:时间复杂度:O(1)
查:时间复杂度:O(logN)
删:右子树最左的节点,左子树最右节点,但是不具平衡性
平衡搜索二叉树:O(log N)
改平衡性:
(1)AVL树
(2)红黑树
(3)S-B树
时间复杂度:O(logN)
基本操作:右旋,左旋
平衡性来自:LL、LR、RL、RR
代码不用会
3+.跳表
类似平衡搜索二叉树:但是底层不是树
算法时间复杂度:O(log N)
插数
4.大楼轮廓
5.最大搜索二叉子树
分析套路:列出可能性:左树是,右树是,整棵树是。然后收集信息
- 左树最搜大小
- 右数最搜大小
- 左树最搜头
- 右树最搜头
- 左树max
- 右树min
6.子数组最长累加和
拓展:
1、一个数组中,只有奇数和偶数,求奇数和偶数相等的子数组,将奇数设为1,偶数设为-1,和为0的最长子数组
2、一个数组中,只含有0和1,求一个数组中0和1数量相等的子数组
转换:1还是1,0变为-1,同1
3、一个数组中,含有0,1,2,求一个含有等量1和2的最长子数组,2变为-1,累加和为0
7.异或和为0最长子数组
没有太明白,有空了详细看
8.求一颗二叉树上的最远距离
分析套路:列出可能性:最大距离在左子树,最大距离来自右子树,带上根节点的整体。然后收集信息
- 左树深
- 右数深
- 左树最大距离
- 右树最大距离
然后递归求解
9.多叉树:员工活跃度
可能性:X来,X不来
- 来的活跃度
- 不来的活跃度
10.判断一棵树是否是平衡二叉树
套路:
可能性:左平,右平,整棵树平
返回信息:
- 左平或者不平
- 左平时候的高度
- 右平时候的高度
1.数据结构设计题:设计LRU
之后详细看
内存替换算法
hashmap+双向链表
2.设计LFU
之后详细看
3.返回字符串公式的计算结果
1.搜索二叉树,完全二叉树
搜索二叉树:中序遍历,跟踪升序
完全二叉树:按层遍历:两种条件判断
用leaf标记阶段开启
2.子数组的最大异或和
前缀树