代码随想录解析
一:二叉树的种类
1:满二叉树
2:完全二叉树
3:二叉搜索树:左孩子、根、右孩子权值依次增加。
4:平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树。
具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,unordered_set、unordered_map底层实现是哈希表。
二:二叉树的存储方式(二叉树可以链式存储,也可以顺序存储)
链式存储:节点包含权值和左右孩子节点指针。(有的方法包括双亲等)
顺序存储:从上到下从左到右(即层序)依次存储到数组中。
如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。
三:二叉树遍历方式:
深度优先遍历:先往深走,遇到叶子节点再往回走。
广度优先遍历:一层一层的去遍历。
从深度优先遍历和广度优先遍历进一步拓展,才有如下遍历方式:
深度优先遍历:
1:前序遍历(递归法,迭代法)
2:中序遍历(递归法,迭代法)
3:后序遍历(递归法,迭代法)
前中后序遍历指的就是中间节点的遍历顺序
广度优先遍历:
1:层次遍历(迭代法)
深度优先遍历(前中后序遍历)的逻辑其实都是可以借助栈使用非递归的方式来实现的。
广度优先遍历的实现一般使用队列来实现,因为需要先进先出的结构,才能一层一层的来遍历二叉树。
深度优先遍历可以借助栈来实现,广度优先遍历可以借助队列来实现。
深度优先遍历理解(深度对应的就是最 左中右就是找最左的那个)
5
4 6
1 2 7 8
前序遍历:(中左右):5412678
后序遍历:(左右中):1247865
中序遍历:(左中右):1425768
理解中序遍历:首先从根找左,到4先不选定4然后从这三个节点找左即1然后中右 4、2。
链式存储的二叉树节点的定义方式
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};