zoukankan      html  css  js  c++  java
  • 判断一颗二叉树是不是另外一颗的子结构

    这是一道比较经典的题目。我先是在百度的在线笔试中遇到,然后发现剑指Offer上有原题。当然题目并不完全一样不过大致相同。

    百度笔试是给你两个根节点判断第棵树是不是第一棵树的子树。剑指Offer是问你第二颗数是不是第一棵树的子结构(也就是说可是是第一棵二叉树的中间阶段)。

    笔试的时候恁是没完全通过测试案例,就差几个,实在也是不知道是什么问题。这次剑指Offer的在线测试中,发现他的描述不是很准确。我一开始以为空树是任何树的子结构,结果空树不是任何数的子结构。

    第一版代码:算法复杂度是O(M * N) ;M是第一棵树的元素个数,N是第二颗树的元素个数。

     1 /**
     2 public class TreeNode {
     3     int val = 0;
     4     TreeNode left = null;
     5     TreeNode right = null;
     6 
     7     public TreeNode(int val) {
     8         this.val = val;
     9 
    10     }
    11 
    12 }
    13 */
    14 public class Solution {
    15     public boolean HasSubtree(TreeNode root1,TreeNode root2) {
    16         
    17         if(root2 == null)
    18             return false;
    19         
    20         return DFS(root1, root2);
    21     }
    22     
    23     private boolean DFS(TreeNode root1, TreeNode root2) {
    24         
    25           if(root1 == null)
    26             return false;
    27         
    28         if(IsSubTree(root1, root2))
    29             return true;
    30         
    31         return HasSubtree(root1.left, root2) | HasSubtree(root1.right, root2);  
    32     }
    33     
    34     private boolean IsSubTree(TreeNode root1, TreeNode root2) {
    35         
    36         if(root2 == null)
    37             return true;
    38         else {
    39             if(root1 == null || root1.val != root2.val)
    40                 return false;
    41             return IsSubTree(root1.left, root2.left) & IsSubTree(root1.right, root2.right);
    42         }
    43         
    44     }
    45 }
  • 相关阅读:
    shell脚本编程-结构化命令3-while、until命令
    shell脚本编程-结构化命令2-for命令
    sscanf解析复杂字符串,双引号通配符的使用问题
    shell脚本编程-结构化命令1-分支语句
    shell脚本编程基础
    linux系统管理的基本命令2
    linux系统管理的基本命令
    redis
    Eclipse启动报错
    java斗地主发牌源码
  • 原文地址:https://www.cnblogs.com/dsj2016/p/5522210.html
Copyright © 2011-2022 走看看