二叉树的学习(一)

426 阅读2分钟

这是我参与更文挑战的第 3 天,活动详情查看: 更文挑战

问:二叉树有几种存储方式?什么样的二叉树适合用数组来存储?

二叉树是使用较多的一种树形结构,如比较经典的二叉排序树,Huffman编码等,都使用到了二叉树的结构,同时,在机器学习算法中,基于树的学习算法中也大量使用到二叉树的结构,因此,我们有必要对二叉树的结构有比较详细的了解和掌握。

树的高度,深度,层

  • 从根节点到最深节点的最长路径的节点数。

  • 从根到最深节点的最长路径的边数。

image-20210308075654552.png

除了叶子结点之外,每个节点都有左右两个子节点,这种树就叫做满二叉树。

最后一层的叶子节点都靠左排列,并且除了最后一层,其它层的节点个数都要达到最大,这种二叉树叫做完全二叉树。

如何表示(或者存储)一棵二叉树?

一种是基于指针或引用的二叉链式存储法,一种是基于数组的顺序存储法。

如果某棵二叉树是一棵完全二叉树,那用数组存储无疑是最节省内存的一种方式。因为数组的存储方式并不需要像链式存储法那样,要存储额外的左右子节点的指针。这也是为什么完全二叉树会单独拎出来的原因,也是为什么完全二叉树要求最后一层的子节点都靠左的原因。

堆其实就是一种完全二叉树,最常用的存储方式就是数组。

二叉树的遍历

前序遍历,中序遍历和后序遍历,层序遍历

前序遍历:自己 -> 左子树 -> 右子树

中序遍历:左子树 -> 自己 -> 右子树

后序遍历:左子树 -> 右子树 -> 自己

二叉树遍历的时间复杂度是 O(n){O(n)},因为每个节点最多会被访问两次。

  1. 给定一组数据,比如 1,3,5,6,9,10。你来算算,可以构建出多少种不同的二叉树?

    n! 如果是完全二叉树,可以放在数组里面,问题可以简化为数组内的元素有多少种组合方式。

  2. 我们讲了三种二叉树的遍历方式,前、中、后序。实际上,还有另外一种遍历方式,也就是按层遍历,你知道如何实现吗?

递归和普通遍历方式