0
点赞
收藏
分享

微信扫一扫

LeetCode刷题day16


算法打卡第十六天,今天你刷题了吗
😄😄😄😄😄😄😄😄😄😄
😃😃😃😃😃😃😃😃😃😃
💓💓💓大家一起来刷题!💓💓💓
😍😍😍😍😍😍😍😍😍😍
😘😘😘😘😘😘😘😘😘😘

LeetCode刷题day16_leetcode

​​226. 翻转二叉树​​

翻转一棵二叉树。

示例:

输入:

4
/ \
2 7
/ \ / \
1 3 6 9
输出:

4
/ \
7 2
/ \ / \
9 6 3 1

方法一:递归

动图演示:

LeetCode刷题day16_子节点_02

其实就是交换一下左右节点,然后再递归的交换左节点,右节点
根据动画图我们可以总结出递归的两个条件如下:

  • 终止条件:当前节点为 null 时返回
  • 交换当前节点的左右节点,再递归的交换当前节点的左节点,递归的交换当前节点的右节点

时间复杂度:每个元素都必须访问一次,所以是 O(n)
空间复杂度:最坏的情况下,需要存放 O(h) 个函数调用(h是树的高度),所以是 O(h)

代码实现

//结束条件为左右都为空
TreeNode* invertTree(TreeNode* root) {
if(root==NULL) {
return root;
}
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
invertTree(root->left);
invertTree(root->right);

return root;

}

方法二:迭代

递归实现也就是深度优先遍历的方式,那么迭代对应的就是广度优先遍历。
广度优先遍历需要额外的数据结构–队列,来存放临时遍历到的元素。
深度优先遍历的特点是一竿子插到底,不行了再退回来继续;而广度优先遍历的特点是层层扫荡。
所以,我们需要先将根节点放入到队列中,然后不断的迭代队列中的元素。对当前元素调换其左右子树的位置,然后:

  • 判断其左子树是否为空,不为空就放入队列中
  • 判断其右子树是否为空,不为空就放入队列中

动态图如下:

LeetCode刷题day16_算法_03

代码实现

//迭代法bfs 
TreeNode* invertTree(TreeNode* root) {
if(root==NULL){
return root;
}
//将二叉树的节点逐层放到队列中,再跌倒处理队列中的元素
queue<TreeNode*> Q;
Q.push(root);
while(!Q.empty()){
TreeNode* node= Q.front();
Q.pop();
TreeNode* temp = node->left;
node->left = node->right;
node->right = temp;
if(node->left!=NULL){
Q.push(node->left);
}
if(node->right!=NULL){
Q.push(node->right);
}
}
return root;
}
}

LeetCode刷题day16_算法_04


LeetCode刷题day16_leetcode_05

​​112. 路径总和​​

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。

叶子节点 是指没有子节点的节点。

示例 1:

LeetCode刷题day16_递归_06

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true

示例 2:

LeetCode刷题day16_子节点_07

输入:root = [1,2,3], targetSum = 5
输出:false

示例 3:

输入:root = [1,2], targetSum = 0
输出:false

方法一:递归

参考代码

//方法一:递归 
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==NULL){
return false;//要么是根节点为null,要么不是叶子节点.
}
int sum = targetSum - root->val;
//判断当前节点是否是叶子节点
if(root->left==NULL&&root->right==NULL){
return sum==0;
}
//如果不是叶子节点 ,则继续递归,判断左子树和右子树上面的叶子节点
return hasPathSum(root->left,sum)||hasPathSum(root->right,sum);
}

方法二:dfs

方法二:dfs
bool hasPathSum(TreeNode* root, int targetSum) {
return dfs(root,0,targetSum);
}

bool dfs(TreeNode* root,int sum,int targetSum){
if(root==NULL){//结束条件
return false;
}
sum += root->val;
//判断是否是叶子节点
if(root->left==NULL&&root->right==NULL){
return sum==targetSum;
}
return dfs(root->left,sum,targetSum)||dfs(root->right,sum,targetSum);
}

😜😜😜😜😜 大家卷起来! 😝😝😝😝😝

LeetCode刷题day16_递归_08


举报

相关推荐

0 条评论