一、层序遍历-LeetCode 102
Leecode链接: leetcode 102
文章链接: 代码随想录
视频链接: B站
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
思路
使用一个队列来存放节点,当队列不为空时,弹出队列首部元素,并插入该元素的左右节点到队列中,直到队列为空退出循环。
实现代码
//cpp
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*>que;
vector<vector<int>>res;
if(root != nullptr) que.push(root);
while(!que.empty()){
vector<int>temp;
int size = que.size();
while(size--){
TreeNode* p = que.front();
que.pop();
if(p->left) que.push(p->left);
if(p->right) que.push(p->right);
temp.push_back(p->val);
}
res.push_back(temp);
}
return res;
}
};
个人问题
熟练度不够,没有把握好双循环的写法。
总结
整体比较简单,需要注意每次插入数据时,需要提前判断队列中的元素个数,元素个数代表需要循环插入多少次的左右节点,队列弹出元素也需要放在最里面的循环中。
二、翻转二叉树-LeetCode 226
Leecode链接: LeetCode 226
文章链接: 代码随想录
视频链接: B站
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
思路
使用后续遍历递归交换左右节点。
实现代码
//cpp
class Solution {
public:
void inver(TreeNode* root){
if(root == nullptr){
return;
}
inver(root->left);
inver(root->right);
TreeNode* temp = nullptr;
temp = root->right;
root->right = root->left;
root->left = temp;
}
TreeNode* invertTree(TreeNode* root) {
inver(root);
return root;
}
};
个人问题
无。
总结
题目既可以后序也可以先序遍历,这两种方法好理解一点,整体简单。
三.对称二叉树-LeeCode 101
Leecode链接: LeetCode 101
文章链接: 代码随想录
视频链接: B站
给你一个二叉树的根节点 root , 检查它是否轴对称
示例:
输入:root = [1,2,2,3,4,4,3]
输出:true
思路
本题优先比较孩子节点,然后根据孩子节点的情况判断父节点,左子树优先遍历左节点,右子树优先遍历右节点,然后对比两个值,如果不同直接返回false
实现代码
//cpp
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right){
if(left == nullptr&&right != nullptr) return false;
else if(left != nullptr && right == nullptr) return false;
else if(left == nullptr && right == nullptr) return true;
else if(left->val != right->val) return false;
bool outside = compare(left->left,right->right);
bool inside = compare(left->right,right->left);
bool temp = outside && inside;
return temp;
}
bool isSymmetric(TreeNode* root) {
bool res = compare(root->left,root->right);
return res;
}
};
个人问题
代码没有自己写出来。
总结
该题需要注意,退出条件那里,为什么不用判断left->val == right->val,是因为如果判断值相等就返回true,会导致没有遍历完整个二叉树,也就是要考虑等于nullptr时才可以退出递归。