二叉树种类
- 满二叉树
- 完全二叉树(底层连续)
- 二叉搜索树(节点元素有一定顺序)
- 平衡二叉搜索树(左子树与右子树高度差绝对值小于)
存储方式
二叉树的遍历
- 深度优先遍历
- 前序遍历 中左右
- 中序遍历 左中右
- 后序遍历 左右中
- 广度优先遍历
LeetCode 144 前序遍历
class Solution {
public:
vector<int> res;
void dfs(TreeNode* cur) {
if (cur == nullptr) return;
res.push_back(cur->val);
dfs(cur->left);
dfs(cur->right);
}
vector<int> preorderTraversal(TreeNode* root) {
dfs(root);
return res;
}
};
LeetCode 145 后序遍历
class Solution {
public:
vector<int> res;
void dfs(TreeNode* cur) {
if (cur == nullptr) return;
dfs(cur->left);
dfs(cur->right);
res.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
dfs(root);
return res;
}
};
LeetCode 94 中序遍历
class Solution {
public:
vector<int> res;
void dfs(TreeNode* cur) {
if (cur == nullptr) return;
dfs(cur->left);
res.push_back(cur->val);
dfs(cur->right);
}
vector<int> inorderTraversal(TreeNode* root) {
dfs(root);
return res;
}
};
LeetCode 102 层序遍历
class Solution {
public:
queue<TreeNode*> q;
vector<vector<int>> res;
vector<vector<int>> levelOrder(TreeNode* root) {
if (root == nullptr) return {};
q.push(root);
while (!q.empty()) {
int size = q.size();
vector<int> path;
for (int i = 0; i < size; i ++) {
TreeNode* temp = q.front();
q.pop();
path.push_back(temp->val);
if (temp->left) q.push(temp->left);
if (temp->right) q.push(temp->right);
}
res.push_back(path);
}
return res;
}
};
二叉搜索树
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树