层序遍历 10
题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历
二叉树的层序遍历:即逐层地,从左到右访问所有节点
这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。
我们可以用队列和一个二位数组解决这个问题。
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> result;
if(root!=NULL) que.push(root);
while(que.empty()==false)
{
int size=que.size();//size记录每一层元素的个数
vector<int> ver;
for(int i=1;i<=size;i++)
{
TreeNode* node=que.front();//新建树节点存储即将删去的队元素
que.pop();
if(node->left) que.push(node->left);//加入左孩子
if(node->right) que.push(node->right);//加入有孩子
ver.push_back(node->val);//将删去节点的值存入ver数组中
}
result.push_back(ver);将每层所形成的ver数组存入二维数组result中
}
return result;
}
};
while(que.empty() ----->实现每层的循环
int size=que.size(); 记录每一层的元素,由于经过for里的删减增加 que.siz()会随之改变
226.翻转二叉树
题目链接:226. 翻转二叉树 - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树
再解决这道题之前,我们要了解swap函数可以实现一个节点左右孩子的交换
swap(root->left,root->right);
这道题可以用递归解决。
我们要确定递归三部曲:
- 确定递归函数的参数和返回值
- 确定终止条件
- 确定单层递归的逻辑
1.确定递归函数的参数和返回值:TreeNode * root
TreeNode* invertTree(TreeNode* root)
2.确定终止条件:当节点为空时终止
if(root==NULL) return root;
3.确定单层逻辑:
这道题可以用深搜中的前序(中左右)或者后序(中右左)来解决。(不推荐中序)
前序:
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
后序:
invertTree(root->left);
invertTree(root->right);
swap(root->left, root->right);
中序(左中右)为什么不行,我们思考一下,我们一开始对左子树进行反转,接着通过中,将左右子树反转,那我这个右反转的不还是原来的左子树吗?
所以如果真要写中序代码的话,应该是左中左。代码如下:
invertTree(root->left);
swap(root->left, root->right);
invertTree(root->left);
总代码如下:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL) return root;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
101.对称二叉树
题目链接:226. 翻转二叉树 - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树
这道题我觉得难度并不大,也并没有运用到啥算法,主要还是对二叉树的理解。
依旧可以使用递归来做。
递归三部曲:
确定递归参数和返回值:注意!这里的两个参数是根节点的左右两个子树
bool compare(TreeNode* left,TreeNode* right)
确定递归终止条件
1.一边为空,一边不为空,返回false
2.两边对为空,返回true
3.两边都不为空,且值不同,返回false
if(left==NULL&&right!=NULL) return false;
else if(left!=NULL&&right==NULL) return false;
else if(left==NULL&&right==NULL) return true;
else if(left->val!=right->val) return false;
3.确定单层逻辑:
就是判定外侧和里侧是否都对称,如果都对称再看中间
bool outside=compare(left->left,right->right);
bool inside=compare(left->right,right->left);
bool mid=outside&&inside;
return mid;
总代码如下:
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right)
{
if(left==NULL&&right!=NULL) return false;
else if(left!=NULL&&right==NULL) return false;
else if(left==NULL&&right==NULL) 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 mid=outside&&inside;
return mid;
}
bool isSymmetric(TreeNode* root) {
bool result=compare(root->left,root->right);
return result;
}
};
OKOK! Day15打卡成功!四分之一已经过去了,一定要坚持下去!耗时3.5小时。