二叉树节点的定义:
C++中map、multimap、set、multiset的底层实现机制是二叉平衡搜索树,再具体一点是红黑树
平衡二叉树是二叉搜索树和平衡二叉树的结合。
平衡二叉树和完全二叉树的区别在于完全二叉树底层必须是从左到右连续的,且次底层是满的。
堆是一棵完全二叉树,同时保证父子节点的顺序关系(有序)。 但完全二叉树一定是平衡二叉树,堆的排序是父节点大于子节点,而搜索树是父节点大于左孩子,小于右孩子,所以堆不是平衡二叉搜索树。
一、二叉树的遍历
前序遍历(中左右)、中序遍历(左中右)、后序遍历(左右中)
递归三要素:
1)确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
2)确定终止条件:写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
3)确定单层递归的逻辑:确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
迭代遍历过程:
前序遍历:
中序遍历:
后序遍历:
先序遍历是中左右,后续遍历是左右中,只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中
层序遍历:(模板)
二、对称二叉树
101 给定一个二叉树,检查它是否是镜像对称的
100 相同的树
572 另一颗树的子树
三、求二叉树的深度
1)最大深度
三种遍历方式:
后序遍历
前序遍历:(一种回溯过程)
层序遍历:
2)最小深度
求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。
所以,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。
反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。
四、二叉树节点的个数
1)普通二叉树
递归:后序遍历
迭代:层序遍历