前置知识
参考前文
102. 二叉树的层序遍历
题目描述
LeetCode链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/description/
解题思路
思路: 创建一个队列, 存储每一层的元素;
在每一次循环时遍历当前队列中的所有元素, 将其val加入新的vector, 将其子节点入队列
代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root==NULL)
return ans;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
vector<int> curLevel;
int size = q.size();
for(int i=0; i<size; ++i){
TreeNode* curNode = q.front();
q.pop();
curLevel.push_back(curNode->val);
if(curNode->left)
q.push(curNode->left);
if(curNode->right)
q.push(curNode->right);
}
ans.push_back(curLevel);
}
return ans;
}
};
226. 翻转二叉树
题目描述
LeetCode链接:https://leetcode.cn/problems/invert-binary-tree/description/
递归实现
class Solution {
public:
void helper(TreeNode* cur){
if(cur==nullptr)
return;
swap(cur->left, cur->right);
helper(cur->left);
helper(cur->right);
}
TreeNode* invertTree(TreeNode* root) {
helper(root);
return root;
}
};
101. 对称二叉树
题目描述
LeetCode链接:https://leetcode.cn/problems/symmetric-tree/description/
递归实现
class Solution {
public:
bool helper(TreeNode* left, TreeNode* right){
if(left==nullptr && right==nullptr)
return true;
if((left==nullptr && right!=nullptr) || (left!=nullptr && right==nullptr))
return false;
if(left->val == right->val)
return helper(left->left, right->right) && helper(left->right, right->left);
return false;
}
bool isSymmetric(TreeNode* root) {
if(root==nullptr)
return true;
return helper(root->left, root->right);
}
};
迭代实现
两个指针分别指向两个子树, 迭代法, 挨个比较
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==nullptr)
return true;
TreeNode* left=root->left;
TreeNode* right=root->right;
queue<TreeNode*> queLeft, queRight;
queLeft.push(left);
queRight.push(right);
while(!queLeft.empty() && !queRight.empty()){
TreeNode* curL = queLeft.front(); queLeft.pop();
TreeNode* curR = queRight.front(); queRight.pop();
if(!curL && !curR)// 如果二者都是null, 则匹配成功, 继续
continue;
if(!curL || !curR || curL->val != curR->val)// 如果二者分别为null和非null , 或者二者都非null但是val不同, 则false
return false;
queLeft.push(curL->right);
queLeft.push(curL->left);
queRight.push(curR->left);
queRight.push(curR->right);
}
return true;
}
};
总结
一方面要牢固地掌握基础的算法, 比如递归遍历, 层次遍历, 迭代遍历.
因为这是其他操作的基础, 要熟悉基础才能有所生发;
另一方面也要能够灵活地在这些基础算法上, 进行0调整和修改, 从而适应不同题目的需求.
比如层次遍历中是不将null节点加入, 但是在对称二叉树这里是加入的, 并且加入的null节点还是用于确定二叉树结构的重要依据.