二叉树基础(上)

作者 : 开心源码 本文共1799个字,预计阅读时间需要5分钟 发布时间: 2022-05-12 共253人阅读

一、树

1.树的常用概念

根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。

2.概念解释

节点:树中的每个元素称为节点
父子关系:相邻两节点的连线,称为父子关系
根节点:没有父节点的节点
叶子节点:没有子节点的节点
父节点:指向子节点的节点
子节点:被父节点指向的节点
兄弟节点:具备相同父节点的多个节点称为兄弟节点关系
节点的高度:节点到叶子节点的最长路径所包含的边数
节点的深度:根节点到节点的路径所包含的边数
节点的层数:节点的深度+1(根节点的层数是1)
树的高度:等于根节点的高度

图1
图2

二、二叉树

1.概念

1.什么是二叉树?
每个节点最多只有2个子节点的树,这两个节点分别是左子节点和右子节点。
2.什么是满二叉树?
有一种二叉树,除了叶子节点外,每个节点都有左右两个子节点,这种二叉树叫做满二叉树。
3.什么是完全二叉树?
有一种二叉树,叶子节点都在最底下两层,最后一层叶子节都靠左排列,并且除了最后一层,其余层的节点个数都要达到最大,这种二叉树叫做完全二叉树。

3

2.完全二叉树的存储

  1. 链式存储

    图4

    每个节点由3个字段,其中一个存储数据,另外两个是指向左右子节点的指针。我们只需拎住根节点,即可以通过左右子节点的指针,把整棵树都串起来。这种存储方式比较常用,大部分二叉树代码都是通过这种方式实现的。

  2. 顺序存储
    图5
    用数组来存储,对于完全二叉树,假如节点X存储在数组中的下标为i,那么它的左子节点的存储下标为2i,右子节点的下标为2i+1,反过来,下标i/2位置存储的就是该节点的父节点。注意,根节点存储在下标为1的位置。完全二叉树用数组来存储时最省内存的方式。
  3. 二叉树的遍历

    6

    前序遍历:对于树中的任意节点来说,先打印这个节点,而后再打印它的左子树,最后打印它的右子树。
    中序遍历:对于树中的任意节点来说,先打印它的左子树,而后再打印它的本身,最后打印它的右子树。
    后序遍历:对于树中的任意节点来说,先打印它的左子树,而后再打印它的右子树,最后打印它本身。

前序遍历的递推公式:preOrder(r) = print r->preOrder(r->left)->preOrder(r->right)中序遍历的递推公式:inOrder(r) = inOrder(r->left)->print r->inOrder(r->right)后序遍历的递推公式:postOrder(r) = postOrder(r->left)->postOrder(r->right)->print r时间复杂度:3种遍历方式中,每个节点最多会被访问2次,所以时间复杂度是O(n)。

递归代码实现:

void preOrder(Node* root) {  if (root == null) return;  print root // 此处为伪代码,表示打印 root 节点  preOrder(root->left);  preOrder(root->right);}void inOrder(Node* root) {  if (root == null) return;  inOrder(root->left);  print root // 此处为伪代码,表示打印 root 节点  inOrder(root->right);}void postOrder(Node* root) {  if (root == null) return;  postOrder(root->left);  postOrder(root->right);  print root // 此处为伪代码,表示打印 root 节点}

三、思考

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

  • 答: 是卡特兰数,是C[n,2n] / (n+1)种形状,c是组合数,节点的不同又是一个全排列,一共就是n!*C[n,2n] / (n+1)个二叉树。可以通过数学归纳法推导得出。

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

  • 答:层次遍历需要借助队列这样一个辅助数据结构。(其实也可以不用,这样就要自己手动去解决节点的关系,代码不太好了解,好处就是空间复杂度是o(1)。不过用队列比较好了解,缺点就是空间复杂度是o(n))。根节点先入队列,而后队列不空,取出对头元素,假如左孩子存在就入列队,否则什么也不做,右孩子同理。直到队列为空,则表示树层次遍历结束。树的层次遍历,其实也是一个广度优先的遍历算法。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 二叉树基础(上)

发表回复