理论基础
二叉树的分类
(1)满二叉树:只有度为0或2的结点,且度为0的节点都在同一层
度:结点下面引出的边的条数
深度k
结点数:2^k-1
(2)完全二叉树:除了最底层没有填满,其他都满了,且最底层的结点都集中在该层的最左边
二叉搜索树
左子树所有结点 < 根节点 <右子树所有节点,左右子树也分别满足
平衡二叉搜索树
左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
遍历方式
前中后:指中间节点的顺序
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
递归遍历
(1)确定递归函数的参数和返回值
(2)确定终止条件
(3)确定单层遍历的逻辑
中序遍历举例
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec); // 左
vec.push_back(cur->val); // 中
traversal(cur->right, vec); // 右
}
最清晰的遍历视频:使用动画讲解 二叉树递归遍历的代码,数据结构与算法_哔哩哔哩_bilibili
刷题
翻转二叉树:遍历顺序不能是中序,翻转用swap
对称二叉树
二叉树的最大深度
二叉树的层序遍历:逐层,从左到右访问所有节点
自己用队列把过程模拟一遍就会了
二叉树最小深度:当层序遍历,第一次遇到叶子结点的深度
完全二叉树的节点个数:
层序遍历,套模版可以秒了
试试递归遍历