leetcode

特点1 虽然是从root开始,但是 严重依赖从下到上的反馈的数据 ,例如求tree的高度

题目1 最近公共祖先(LCA)

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

LCA 2和5 返回52次

8和7 从上到下不知道,在返回过程中才知道

公共节点

code

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root ==NULL) { return root; } if(root ==p || root ==q) { return root; } TreeNode* left =lowestCommonAncestor(root->left,p,q); TreeNode* right=lowestCommonAncestor(root->right,p,q); if(left && right) { return root; } //如果都不是返回都不是,如果其中一个是返回其中一个。 //如果2个都是,肯定不进入到这里 方向的选择一个就可以 return left ?left:right;  }};

题目2 LeetCode 110. Balanced Binary Tree

依赖下面反馈

  • 文字描述

递归入栈过程中,是不知道是否满足条件的。

只有出栈时候依赖下面反馈

这里 同时统计每个节点的高度 和是否平衡

而不是从root节点开始判断 是否平衡。

  • 代码实现

递归遍历,依赖下面数据

合并在一起

特点2 从上到下,依赖当前root节点判断


1 翻转等价二叉树

我们可以为二叉树 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树。

只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转等价于二叉树 Y。

编写一个判断两个二叉树是否是翻转等价的函数。这些树由根节点 root1 和 root2 给出

  • 选择任意节点,然后交换它的左子树和右子树
  • 左子树和右子树是否继续交换呢? 是否选择了任意节点?
  • 等价tree和翻转等级tree的结合

测试

题目理解错误,以为是全部都翻转了

code

执行用时 : 12 ms/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool flipEquiv(TreeNode* root1, TreeNode* root2) { if(root1 ==NULL && root2 ==NULL) { return true; }  if((root1!=NULL && root2==NULL) ||(root2!=NULL &&root1==NULL)||root1->val !=root2->val) { return false; } /** if(root1->left !=root2->right ||root1->right !=root2->left) { return false; }**/ return flipEquiv(root1->left,root2->right) && flipEquiv(root1->right,root2->left) || flipEquiv(root1->left,root2->left) && flipEquiv(root1->right,root2->right); }};func flipEquiv(root1, root2 *TreeNode) bool { if root1 == nil && root2 == nil { return true } if (root1 != nil && root2 == nil) || (root1 == nil && root2 != nil) || root1.Val != root2.Val { return false } if (flipEquiv(root1.Left, root2.Left) && flipEquiv(root1.Right, root2.Right)) || (flipEquiv(root1.Left, root2.Right) && flipEquiv(root1.Right, root2.Left)) { return true } return false}

2 Leetcode 226: 翻转二叉树

翻转一棵二叉树

翻转一棵二叉树

备注:

这个问题是受到 Max Howell 的 原问题 启发的 :

谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。

题目理解

潜台词:

一上来不要被题目吓住,考虑到每层都要翻转 ,多么麻烦

这一次和下一层 保持左右转换。没有理解递归真正含义

从上到下遍历过程中 来传递数据。

从上到下递归遍历:

  • root保持不变
  • 左右子树交换
  • 重复步骤1和2

测试

感觉很简单呀,swap

翻转一棵二叉树

code

class Solution {public: TreeNode* invertTree(TreeNode* root) { if(root == NULL) { return root; } //!!!!! swap TreeNode *temp=root->left; root->left =root->right; root->right=temp; invertTree(root->left); invertTree(root->right); return root; }};

golang

func invertTree(root *TreeNode) *TreeNode {

if root ==nil {

return root

}

//golang 语法就是简洁

root.Left,root.Right=root.Right,root.Left

invertTree(root.Left)

invertTree(root.Right)

return root

}

总结

这几个题目关键 如何理解题意 翻转一棵二叉树,最近公共祖先(LCA)

等等 把复杂问题 变成重复的子问题

  • 最近公共祖先(LCA)子问题是什么

如果当前节点如果存在,左右子树是 输入的结果, 当前节点就结果,

如果不是,返回其中任何一个可能,存在一个,或者不存在

返回不同可能就是子问题

  • 翻转一棵二叉树 子问题是什么

swap(root) 不考虑层次问题

source tree 递归子模块_每日刷题3--漫谈二叉树的递归遍历相关推荐

  1. 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  2. 【算法刷题1】二叉树的前序遍历

    解题思路 什么是二叉树的前序遍历?简单来说就是"根左右",展开来说就是对于一颗二叉树优先访问其根节点,然后访问它的左子树,等左子树全部访问完了再访问其右子树,而对于子树也按照之前的 ...

  3. java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法

    题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...

  4. 力扣牛客每日刷题(Python解法持续更新)

    力扣牛客每日刷题(持续更新) 初试结束第15天, 之前简单的处理了部分毕设方面的任务, 对接下来的学习做了个简单的规划 决定每天开始刷几道力扣题提高一下算法的理解,不能让之前学的数据结构都忘记了 每道 ...

  5. 2022-04-14每日刷题打卡

    2022-04-14每日刷题打卡 代码源--每日一题 上帝的集合 - 题目 - Daimayuan Online Judge 题目描述 现在上帝有一个空集合,现在他命令你为他执行下列三种操作 n 次, ...

  6. 【每日刷题】P1010 幂次方题解

    [每日刷题]P1010 幂次方题解 题目描述 任何一个正整数都可以用 $2$ 的幂次方表示.例如 $137=2^7+2^3+2^0 $. 同时约定方次用括号来表示,即 $a^b$ 可表示为 $a(b) ...

  7. 2022-03-03每日刷题打卡

    2022-03-03每日刷题打卡 力扣--每日一题 258. 各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数.返回这个结果. 示例 1: 输入: num = 38 输出 ...

  8. 2022-03-31每日刷题打卡

    2022-03-31每日刷题打卡 代码源--每日一题 完美数 - 题目 - Daimayuan Online Judge 对于给定的数字 a , b ,当整数 n 在十进制下的所有数位都为 a 或 b ...

  9. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

最新文章

  1. 2022年六大值得关注的边缘计算趋势
  2. Silverlight测试——利用Ranorex实现数据驱动测试
  3. [转]汇编语言的准备知识--给初次接触汇编者 2
  4. SAP HANA简介
  5. [Qt教程] 第15篇 2D绘图(五)绘制图片
  6. excel转成csv格式的默认分隔符
  7. Flink EventTime和Watermarks原理结合代码分析(转载+解决+精简记录)
  8. because the following virtual functions are pure within
  9. 140. Word Break II
  10. Oracle 存储大文本
  11. virtualenv 安装不同版本的虚拟环境的办法
  12. 计算机中那些事儿(八):再历装系统之终身学习
  13. html5 自带video内存泄露_C++ 如何避免内存泄露?
  14. 易语言禁用计算机指令大全,易语言电脑屏幕锁定工具源码
  15. 推荐几本微积分入门书籍
  16. pcr532,nfc读卡器复制家用门禁卡
  17. 【转-参考】九宫格时间管理-第三代时间管理方法:人生平衡发展的八个方向
  18. 基于python的证件照_不到20行实现Python代码即可制作精美证件照
  19. ap设置 维盟660g_WayOS|路由器WAN口数设置详细教程
  20. 高中数学必考知识点:二元一次不等式(组)及简单的线性规划问题

热门文章

  1. 【Kaggle-MNIST之路】CNN结构改进+改进过的损失函数(五)
  2. 训练生成对抗网络的过程中,训练gan的地方为什么这里没有detach,怎么保证训练生成器的时候不会改变判别器
  3. matlab caxis 刻度,[求助]MATLAB画图问题,caxis.m的问题
  4. 工作三年,我没给家里一分钱,还把家里掏空了
  5. Shell脚本[运算表达式,条件控制语句]
  6. linux wheel组
  7. spoj 375 Query on a tree
  8. [zz]淘宝子团关于kvm 调优的分享
  9. [译]创建物化视图的先决条件
  10. Scrapy入门教程