Before Writing
博主转Java了
参考代码随想录二叉树,希望有所坚持有所收获吧。
对于二叉树我们应该有几个概念:
- 如果有数值和无数值二叉树应该怎么分类
- 对于二叉树遍历有几种方式
- 对于二叉树的存储有几种方式
- 对于二叉树为什么要用递归(左右子树都应满足这个树的性质)
1-二叉树的种类
1-1满二叉树
-
所有根节点都满了,只有度为0和度为2的节点,也就是说对于深度为 k k k的满二叉树,它一共有 2 k − 1 2^k - 1 2k−1个节点(指数求和公式 s u m = 1 − 2 k 1 − 2 sum = \frac{1 - 2^k}{1-2} sum=1−21−2k).
-
请画一下满二叉树的图
1-2完全二叉树
- 只有最底层的叶子结点没有填满,除底层外上面可以看做满二叉树。
- 最底层的的叶子结点只能从左到右一次填充。
- 最多有两层(最底)包含叶子节点。
- 左右子树也是完全二叉树。
1-3二叉搜索树
- 二叉搜索树是一个有序树,它有数值。
- 如果左子树不为空,则左子树节点的数值都小于它的根节点数值。
- 如果右子树不为空,则右子树节点的数值都大于它的根节点数值。
- 左右子树也都为二叉排序树。
1-4平衡二叉搜素树
- 平衡二叉搜索树在二叉搜索树上加了一个限定条件,它的左右子树高度相差不超过一。
- 并且左右子树也是平衡二叉搜索树。
2- 二叉树的存储方式
- 二叉树可以链式存储也可以顺序存储。
- 链式存储用指针,顺序存储用数组。
- 关于链式存储:我们只用指定左右指针即可
- 关于顺序存储:我们索引的方式是,左孩子和右孩子分别为当前节点
i
的i * 2 + 1
和i * 2 + 2
3-二叉树的遍历方式
关于二叉树我们分为深度优先遍历和广度优先遍历:
- 深度优先:前序,中序,后序。
- 广度优先:层次遍历。
- 我们通常使用递归的形式进行深度遍历,而广度优先搜索使用队列的形式。
4-关于java容器
- java容器分为Collection和Map
- 其中Collection分为:
- List: ArrayList, LinkedList, Vector, Stack
- Set: HashSet, LinkedHashSet, TreeSet
- 其中Map分为:
- HashMap: LinkedHashMap
- TreeMap
- ConcurrentHashMap
- Hashtable
4-1 Collection和Map的区别
Collection:存放独立的元素
Map:存放键值对
4-2 List和Set的区别
List是可重复集合,Set是不可重复集合,这两个接口都实现了Conllection父类接口。
但是,Map并没有继承Conllection,他是一个独立的接口,Map是一种把键对象和值对象进行映射的集合,他的每一个元素都包含了一对键对象和值对象,Map中存储的数据是没有顺序的,它的key是不能重复的,他得值是可以有重复的。
4-4 List的实现
- ArrayList和Vector内部是线性动态数组结构,所以查询效率上会高很多,Vector是线程安全的,相比ArrayList线程是不安全的,所以性能会稍慢一些。
- LinkedList:是双向链表的数据结构存储数据,在做查询时会按照序号索引数据进行前向和后向遍历,查询效率偏低,但插入数据时只需要记录本项的前后项即可,所以插入速度较快。
4-5 Set的实现
- HashSet:它的内部是哈希表(实际上是一个HashMap实例)支持的。但他不保证set元素的迭代顺序。
- TreeSet:TreeSet使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序。
4-6 Map的实现
- Map接口有三个实现类:Hashtable,HashMap,TreeMap,LinkedHashMap
- Hashtable:内部存储的键值对是无序的,是按照哈希算法进行排序,与HashMap最大的区别就是线程安全。键或者值不能为null,为null就会抛出空指针异常。
- TreeMap:基于红黑树(red-black tree)数据结构实现,按key排序,默认的排序方式升序。
- LinkedHashMap:有序的Map集合实现类,相当于一个栈,先put进去的最后出来,先进后出。
4-7 List和Map区别
- 一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复,Map中存储的数据是没有顺序的,其key是不能重复的,他得值是可以有重复的。
Let’s Code
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;TreeNode() {};TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode right, TreeNode left) {this.val = val;this.left = left;this.right = right;}
}