训练营打卡Day14
二叉树的种类
满二叉树
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树,节点数2^k - 1
完全二叉树
除底层外,其他层都是满的,底层的节点从左到右是连续的
二叉搜索树
平衡二叉搜索树
左子树和右子树的高度差不能大于一
实现:set、map
插入节点:O(logn)
查询节点:O(logn)
二叉树的存储方式
- 链式存储,链表
- 线性存储,数组,左子树 2i+1, 有右子树 2i+2
二叉树的遍历
深度优先搜索
前序遍历
- 递归法
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec)
{
if(!cur) return;
vec.push_back(cur->val);
traversal(cur->left, vec);
traversal(cur->right, vec);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int>ans;
traversal(root, ans);
return ans;
}
};
- 迭代法
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
if(!root) return ans;
stack<TreeNode*>st;
st.push(root);
while(!st.empty())
{
auto node = st.top();
st.pop();
if(node)
{
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
st.push(node);
st.push(0);
}
else
{
node = st.top();
st.pop();
ans.push_back(node->val);
}
}
return ans;
}
};
- 中序遍历
- 后序遍历
广度优先搜索
- 层序遍历
迭代法
用一个队列
二叉树的定义
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int v): val(v), left(nullptr), right(nullptr{}
}