一、二叉树的种类
1、 满二叉树
2、完全二叉树
3、二叉搜索树
4、平衡二叉树
- 又称AVL树,左右两个子树的高度差的绝对值不超过1
- C++中:map、set、multimap、multiset的底层实现都是平衡二叉树;
- unordered_map、unordered_set、unordered_multimap、unordered_multiset的底层实现是哈希表
二、二叉树的存储方式
- 二叉树既可以链式存储;也可以顺序储存。
- 链式存储:指针
- 顺序储存:数组【父节点i,左孩子2i+1,右孩子2i+2】
三、二叉树的遍历方式
1、深度优先
- 先往深处遍历,遇到叶子节点再往回遍历
- 递归法、迭代法【可以使用栈实现】
(1)前序遍历
void traversal(TreeNode *cur,vector<int>& vec){
if(cur==nullptr) return;
vec.push_back(cur->val);
traversal(cur->left,vec);
traversal(cur->right,vec);
}
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> vec;
if(root==nullptr) return vec;
st.push(root);
while(!st.empty()){
TreeNode* node=st.top();
st.pop();
if(node!=nullptr) vec.push_back(node->val);
if(node->right!=nullptr) st.push(node->right);
if(node->left!=nullptr) st.push(node->left);
}
return vec;
}
};
(2) 中序遍历
void traversal(TreeNode *cur,vector<int>& vec){
if(cur==nullptr)return;
traversal(cur->left,vec);
vec.push_back(cur->val);
traversal(cur->right,vec);
}
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> vec;
TreeNode* node=root;
while(node!=nullptr||!st.empty()){
if(node!=nullptr){
st.push(node);
node=node->left;
}
else{
node=st.top();
st.pop();
vec.push_back(node->val);
node=node->right;
}
}
return vec;
}
};
(3) 后序遍历
void traversal(TreeNode *cur,vector<int>& vec){
if(cur==nullptr)return;
traversal(cur->left,vec);
traversal(cur->right,vec);
vec.push_back(cur->val);
}
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> vec;
if(root==nullptr) return vec;
st.push(root);
while(!st.empty()){
TreeNode* cur=st.top();
st.pop();
if(cur!=nullptr) vec.push_back(cur->val);
if(cur->left!=nullptr) st.push(cur->left);
if(cur->right!=nullptr) st.push(cur->right);
}
reverse(vec.begin(),vec.end());
return vec;
}
};
2、广度优先
(1)层序遍历
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if(root!=nullptr) que.push(root);
vector<vector<int>> result;
while(!que.empty()){
vector<int> vec;
int size=que.size();
for(int i=0;i<size;i++){
TreeNode* node=que.front();
que.pop();
vec.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
result.push_back(vec);
}
return result;
}
};
四、二叉树的定义
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int val):val(val),left(nullptr),right(nullptr){}
};