这是我参与更文挑战的第 3 天,活动详情查看: 更文挑战
问:二叉树有几种存储方式?什么样的二叉树适合用数组来存储?
二叉树是使用较多的一种树形结构,如比较经典的二叉排序树,Huffman编码等,都使用到了二叉树的结构,同时,在机器学习算法中,基于树的学习算法中也大量使用到二叉树的结构,因此,我们有必要对二叉树的结构有比较详细的了解和掌握。
树的高度,深度,层
-
从根节点到最深节点的最长路径的节点数。
-
从根到最深节点的最长路径的边数。
除了叶子结点之外,每个节点都有左右两个子节点,这种树就叫做满二叉树。
最后一层的叶子节点都靠左排列,并且除了最后一层,其它层的节点个数都要达到最大,这种二叉树叫做完全二叉树。
如何表示(或者存储)一棵二叉树?
一种是基于指针或引用的二叉链式存储法,一种是基于数组的顺序存储法。
如果某棵二叉树是一棵完全二叉树,那用数组存储无疑是最节省内存的一种方式。因为数组的存储方式并不需要像链式存储法那样,要存储额外的左右子节点的指针。这也是为什么完全二叉树会单独拎出来的原因,也是为什么完全二叉树要求最后一层的子节点都靠左的原因。
堆其实就是一种完全二叉树,最常用的存储方式就是数组。
二叉树的遍历
前序遍历,中序遍历和后序遍历,层序遍历
前序遍历:自己 -> 左子树 -> 右子树
中序遍历:左子树 -> 自己 -> 右子树
后序遍历:左子树 -> 右子树 -> 自己
二叉树遍历的时间复杂度是 ,因为每个节点最多会被访问两次。
-
给定一组数据,比如 1,3,5,6,9,10。你来算算,可以构建出多少种不同的二叉树?
n! 如果是完全二叉树,可以放在数组里面,问题可以简化为数组内的元素有多少种组合方式。
-
我们讲了三种二叉树的遍历方式,前、中、后序。实际上,还有另外一种遍历方式,也就是按层遍历,你知道如何实现吗?
递归和普通遍历方式