学习目标:
- 102. 层序遍历
- 226.翻转二叉树
- 101.对称二叉树
学习内容:
102. 层序遍历
//方法1,队列先进先出
class Solution
{
public:
vector<vector<int>> levelOrder(TreeNode *root)
{
// 先定义返回结果的
vector<vector<int>> result;
queue<TreeNode *> que;
if (root != nullptr)
que.push(root); // 先把根节点塞进去,从第一层开始
while (!que.empty())
{
int size = que.size(); // 获取同一层总共有多少个节点,比如第一层就只有一个节点
vector<int> vec; // 这是存放每一层节点的vector
for (int i = 0; i < size; i++)
{
TreeNode *node = que.front();
vec.push_back(node->val);
que.pop();
if (node->left)
que.push(node->left);
if (node->right)
que.push(node->right);
}
// 同一层的循环结束
result.push_back(vec);
}
return result;
}
};
// 方法2,递归法,依照深度为变量。
class Solution
{
public:
void Order(TreeNode *node, vector<vector<int>> &result, int depth)
{
if (node == nullptr)
return;
if (result.size() == depth)
result.push_back(vector<int>()); // 开始新的一层的时候先加一个vector,用来存放这一层的节点
result[depth].push_back(node->val);
Order(node->left, result, depth + 1);
Order(node->right, result, depth + 1);
}
vector<vector<int>> levelOrder(TreeNode *root)
{
vector<vector<int>> result;
int depth = 0;
TreeNode *cur = root;
Order(cur, result, depth);
return result;
}
};
错误以及注意事项
- push_back 主要用于顺序容器,如 vector、deque(双端队列) 等,而 push 则通常与栈(stack)和队列(queue)相关。
容器 | 添加元素 |
---|---|
vector | push_back() |
stack | push() |
queue | push() |
deque | push_back() , push_front() |
226.翻转二叉树
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
//确定终止条件
if(root==nullptr) return root;
// 确定单层递归的逻辑
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
// 用栈迭代!
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr) return root;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
swap(node->right,node->left);
if(node->left) st.push(node->left);
if(node->right) st.push(node->right);
}
return root;
}
};
错误以及注意事项
- 两个写法都不是很熟练,统一写法没看。
//与前序遍历对比代码
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
vec.push_back(cur->val); // 中
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
学习时间:
2023.12.14 18:00-20:54
眼睛太痛了,明天再看最后一题。