• Java另一棵树的子树


    目录

    1.题目描述

    2.题解

    思路分析

    具体实现

    完整代码


    1.题目描述

    给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 

    二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

    示例:

    输入:root = [3, 4, 5, 1, 2],subRoot = [4, 1, 2]

    输出:true

    2.题解

    思路分析

    我们首先判断两棵二叉树是否相同,若相同,则subRoot是root的子树;

    若不相同,则判断root的左子树是否与subRoot是否相同,若相同,则subRoot是root的子树;

    若不同,判断root的右子树是否与subRoot相同,若相同,subRoot是root的子树;

    若不同,继续递归判断...

    具体实现

    1.首先实现判断两棵二叉树是否相同的代码:

    (1)若两棵二叉树都为空,则两颗二叉树相同;若两颗二叉树中只有一棵树为空,则不同

    (2)若两棵二叉树都不为空,再判断其根节点的值是否相同,若不相同,两棵二叉树不相同;若相同,再分别判断两颗二叉树的左子树是否相同,右子树是否相同。(通过递归实现)

    具体过程:

    代码实现:

    1. public boolean isSameTree(TreeNode p, TreeNode q) {
    2. //都为null,相同
    3. if(p == null && q == null){
    4. return true;
    5. }
    6. //只有一个为null,不同
    7. if(p == null|| q == null){
    8. return false;
    9. }
    10. //都不为空,但值不为空,不同
    11. if(p.val != q.val){
    12. return false;
    13. }
    14. //判断两颗二叉树的左子树、右子树是否相同
    15. return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    16. }

    2.判断subRoot是否为root子树

    (1)若subRoot为空,则subRoot为root的子树,返回true

    (2)若root为空,则subRoot不为root的子树。返回false

    (1)判断subRoot是否与root相同

    (2)判断subRoot是否是root的左子树

    (3)判断subRoot是否是root的右子树

    若都不相同,最后返回false

    具体过程:

    代码实现:

    1. public boolean isSubtree(TreeNode root, TreeNode subRoot) {
    2. if(subRoot == null){
    3. return true;
    4. }
    5. if(root == null) {
    6. return false;
    7. }
    8. //1、是不是和根节点相同
    9. if(isSameTree(root,subRoot)) {
    10. return true;
    11. }
    12. //2、判断是不是root的左子树
    13. if(isSubtree(root.left,subRoot)) {
    14. return true;
    15. }
    16. //3、右子树
    17. if(isSubtree(root.right,subRoot)) {
    18. return true;
    19. }
    20. //4、返回
    21. return false;
    22. }

    完整代码

    1. class Solution {
    2. public boolean isSameTree(TreeNode p, TreeNode q) {
    3. if(p == null && q == null){
    4. return true;
    5. }
    6. if(p == null|| q == null){
    7. return false;
    8. }
    9. if(p.val != q.val){
    10. return false;
    11. }
    12. return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    13. }
    14. public boolean isSubtree(TreeNode root, TreeNode subRoot) {
    15. if(subRoot == null){
    16. return true;
    17. }
    18. if(root == null) {
    19. return false;
    20. }
    21. //1、是不是和根节点相同
    22. if(isSameTree(root,subRoot)) {
    23. return true;
    24. }
    25. //2、判断是不是root的左子树
    26. if(isSubtree(root.left,subRoot)) {
    27. return true;
    28. }
    29. //3、右子树
    30. if(isSubtree(root.right,subRoot)) {
    31. return true;
    32. }
    33. //4、返回
    34. return false;
    35. }
    36. }

    题目来自:

    572. 另一棵树的子树 - 力扣(LeetCode)

  • 相关阅读:
    视觉-相机、镜头选择
    80C51单片机指令寻址方式
    非接触式额温枪开发PCBA方案
    已解决com.netflix.client.ClientException Eureka客户端异常的正确解决方法,亲测有效!!!
    【SpringMVC】提问问题汇总
    驱动开发:通过PIPE管道与内核层通信
    谷歌浏览器无法翻译已解决
    笔试刷题汇总
    c++ 常见类内的关键字
    英语语法汇总(12.倒装句)
  • 原文地址:https://blog.csdn.net/2301_76161469/article/details/133655364