二叉树的基础知识

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:二叉树是一种重要的数据结构,也是面试和笔试的重头,接下来我们要系统性的总结二叉树的知识点。


一、你应该具备的基础知识

1、结点的度:树中结点拥有的子树个数。度为0的结点为叶结点或终端结点。

2、树的度:树中所有结点的度的最大值。(不是和)

3、树中结点总数:所有结点的度数和加1

4、度为m的树与m叉树的区别
在这里插入图片描述

5、结点的层次(level )

6、边: 一棵n个结点树有n-1条边

7、路径:从结点n1到结点ni的结点序列,路径的长度为该路径上边的条数。从根到每个结点恰好存在一条路径。

8、结点深度:从根到当前结点的路径的长度。根结点的深度是0 ,右图中B和C的深度是1 , E的深度是2。

9、结点高度:从当前结点到叶结点(终端结点)最长路径的长度。树的叶结点的高度是0。右图中B的高度是2 , C的高度是1。一棵树的深度等于最深的结点的深度,该深度总是等于这棵树的高度。

在这里插入图片描述

10、m叉树中第i层上最多有m^(i-1)个结点
在这里插入图片描述
11、高度为h的m叉树最多有( m^(h-1) ) / (m-1) 个结点

严:
1 )结点的层次从1开始;
2)没有对结点深度和高度作出解释;
3)树中结点最大的层次称为树的深度或高度。

二、二叉树的种类有哪些?

在这里插入图片描述

其中我们接触最多也最重要的是:满二叉树和完全二叉树。

1、满二叉树

只有度为0的结点和度为2的结点,并且度为0的结点在同一层。
高度为h的二叉树有 2^h -1 个结点。
在这里插入图片描述

2、完全二叉树

除最底层可能没填满外,其余每层节点数都达到了最大值,并且最下面一层的结点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2^(h-1)个结点。
在这里插入图片描述

3、二叉搜索树(二叉排序树)

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树;

在这里插入图片描述

4、平衡二叉搜索树

著名的AVL树,更严格的二叉搜索树,它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

C++中set/multiset、map/multimap的底层实现都是红黑树(一种平衡二叉搜索树),所以map、set的增删操作时间时间复杂度是logn。

小结

1、平衡二叉搜索树就是二叉搜索树和平衡二叉树的结合
2、完全二叉树一定是平衡二叉树。他们的区别在于底层节点的位置,完全二叉树底层必须是从左到右连续的,且次底层是满的。
3、堆就是一棵完全二叉树,同时保证父子节点的顺序关系(父节点大于左右孩子)。堆的顺序是父节点大于左右孩子,二叉搜索树是父节点大于左孩子,小于右孩子,所以堆不是平衡二叉搜索树。

三、二叉树的存储方式

1、链式存储(最重要)

图片来源于公众号代码随想录

2、顺序存储(了解)

在这里插入图片描述
如果父节点的数组下标是i,那么它的左孩子就是2i + 1,右孩子就是 2i + 2。

四、二叉树的遍历方式

1、二叉树主要有两种遍历方式:
深度优先遍历:先往深走,遇到叶子节点再往回走。
广度优先遍历:一层一层的去遍历。

从深度优先遍历和广度优先遍历进一步拓展,才有如下遍历方式:
深度优先遍历
前序遍历(递归法,迭代法)
中序遍历(递归法,迭代法)
后序遍历(递归法,迭代法)
广度优先遍历
层次遍历(迭代法)

中间节点的顺序就是所谓的遍历方式
在这里插入图片描述

小结

我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历。

栈其实就是递归的一种是实现结构,也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的。

而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。

五、二叉树的定义(要能手撕)

代码如下(示例):

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};


六、总结

本篇介绍了二叉树的种类、存储方式、遍历方式以及定义,比较全面的介绍了二叉树各个方面的重点,扫了一遍基础。接下来将要重点学习二叉树的遍历方法。
注:本篇文章参考代码随想录公众号整理所得。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值