代码随想录第15天| 二叉树2
102.层序遍历
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
迭代法
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode *> q;
if(root) q.push(root);
while(!q.empty()){
int size = q.size(); // size来控制每层从左到右遍历
vector<int> path;
for(int i = 0; i < size; i++){ // 遍历每层
TreeNode * cur = q.front();
q.pop();
path.push_back(cur -> val);
if(cur -> left) q.push(cur -> left);
if(cur -> right) q.push(cur -> right);
}
res.push_back(path);
}
return res;
}
};
递归法
depth控制当前cur指针的深度(从0开始,最开始结果集size也是0)。
若depth=res.size(),说明当前res中还没有储存cur所处深度的节点,因此要为当前深度创建一个新的vector来储存当前节点。
class Solution {
public:
void traversal(TreeNode * cur, vector<vector<int>>& res, int depth){
if(!cur) return;
if(res.size() == depth) res.push_back(vector<int>());
res[depth].push_back(cur->val);
if(cur -> left) traversal(cur->left, res, depth+1);
if(cur->right) traversal(cur -> right, res, depth+1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
int depth = 0;
traversal(root, res, depth);
return res;
}
};
相关题目
102.二叉树的层序遍历
107.二叉树的层次遍历II
199.二叉树的右视图
637.二叉树的层平均值
429.N叉树的层序遍历
515.在每个树行中找最大值
116.填充每个节点的下一个右侧节点指针
117.填充每个节点的下一个右侧节点指针II
104.二叉树的最大深度
111.二叉树的最小深度
226.翻转二叉树(简单)
LeetCode题目:226.翻转二叉树
代码随想录: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;
}
};
101. 对称二叉树(简单)
LeetCode题目:101. 对称二叉树
代码随想录:101. 对称二叉树
分别比较左右子树的外侧和内侧
// 递归法
bool compare(TreeNode *left, TreeNode *right){
if(!left && !right) return true; // 左右都空
else if (left && !right )return false; // 左不空,右空
else if (!left && right) return false; // 左空,右不空
else if (left->val != right->val) return false; // 值不相等
else{
return compare(left->left, right->right) && compare(right->left, left->right);
}
}
bool isSymmetric(TreeNode* root) {
if(root == nullptr) return true;
return compare(root->left, root->right);
}