zoukankan      html  css  js  c++  java
  • 剑指Offer:树的子结构

    剑指Offer:树的子结构

    题目描述

      输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    解题思路

      实话实说这道题是剑指Offer前半部分难度比较大的,我们先来思考一个简单情况,如下图,左树枝叶比右树繁茂,但是枝干是相同的,不同的枝叶情况不一样

      

      此时,我们如何确定说根节点相同的左树包含右树呢?右树有的节点,我左树在对应位置都有!单反有一个节点值或位置不对,则说明左树不包含右树。我们成这个算法为F(X,Y)。

      我们再来考虑一种复杂情况,即左树存在多个和右树根节点相同的节点x1、x2....,此时我们以x1、x2....分别作为为根节点和右树进行F(X,Y)即可,只要有一个能够返回TRUE,则认为左树包含右树

      

       递归代码言简意赅,但是理解起来确实有点难度!?

    Java题解

    public class Solution {
         public boolean HasSubtree(TreeNode root1,TreeNode root2) {
            if(root1==null||root2==null)
                return false;
            if(root1.val==root2.val&&isContain(root1,root2)){
                return true;
            }
            return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
        }
    
        /**
         * 比较是否包含
         * @param node1
         * @param node2
         * @return
         */
        public boolean isContain(TreeNode node1, TreeNode node2){
            //我为空,你不为空,说明我不包含你
            if(node1==null&&node2!=null)
                return false;
            //咱俩都空,等于值相同
            if(node2==null)
                return true;
            return node1.val == node2.val&& isContain(node1.left, node2.left) && isContain(node1.right, node2.right);
        }
    }
    
    /**
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    

      

      

  • 相关阅读:
    ZOJ 3949 Edge to the Root( 树形dp)
    CCF201812-3 CIDR合并
    CF700E E. Cool Slogans
    BZOJ4552: [Tjoi2016&Heoi2016]排序
    BZOJ3238: [Ahoi2013]差异
    BZOJ4566: [Haoi2016]找相同字符
    Codeforces Global Round 1 A~F
    (HDU)1555-- How many days? (多少天)
    (HDU)1491-- Octorber 21st (校庆)
    (HDU)1465-- 不容易系列之一
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9220659.html
Copyright © 2011-2022 走看看