二叉树:满二叉树和完全二叉树
满二叉树:每个节点度为0或2,且度为0的位于同一层。具有2k-1个节点的二叉树
完全二叉树:除了最底层节点没填满之外,其余每层节点数都达到最大值,并且是从左往右达到排满
二叉搜索树,是一个有序树
平衡二叉搜索树:AVL,左右孩子高度差不超过1,两个子树都是一颗平衡二叉树
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树
二叉树存储方式:链式存储、顺序存储
链式存储
父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。
遍历:前中后序遍历,层序遍历,
深度优先遍历(前序,中序,后序)
广度优先遍历(层次遍历)
递归遍历:一段程序直接或间接调用自身的一种方法,通过这种形式进行一些固定步骤的许多操作,把一个复杂并且庞大的问题简化,通过专注解决它分化出来的小问题,从而解决大问题。
递归条件三要素:1、确定递归函数的参数和返回值
2、确定终止条件
3、确定单层递归的逻辑
二叉树递归前序遍历:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int>result;
traversal(root, result);
return result;
}
void traversal(TreeNode* root, vector<int>& result)
{
if (root == NULL)return;
result.push_back(root->val);
traversal(root->left,result);
traversal(root->right,result);
}
};
二叉树递归中序遍历:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int>result;
Traversal(root, result);
return result;
}
void Traversal(TreeNode* root, vector<int>& result) {
if (root == NULL)return;
Traversal(root->left, result);
result.push_back(root->val);
Traversal(root->right, result);
}
};
二叉树后序遍历:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int>result;
Traversal(root, result);
return result;
}
void Traversal(TreeNode* root, vector<int>& result) {
if (root == NULL)return;
Traversal(root->left, result);
Traversal(root->right, result);
result.push_back(root->val);
}
};