zoukankan      html  css  js  c++  java
  • 245 子树

    原题网址:https://www.lintcode.com/problem/subtree/description

    描述

    有两个不同大小的二叉树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定 T2 是否为 T1的子树。

    若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。

    您在真实的面试中是否遇到过这个题?  

    样例

    下面的例子中 T2 是 T1 的子树:

           1                3
          /               / 
    T1 = 2   3      T2 =  4
            /
           4
    

    下面的例子中 T2 不是 T1 的子树:

           1               3
          /                
    T1 = 2   3       T2 =    4
            /
           4

    标签
    二叉树
    递归
     
     
    思路:又是让人头疼的二叉树,一般可通过递归解决。这道题骨骼清奇的地方在于,他需要两个递归。
    isSame的目的是定根对比子树,isSubtree是定子树对比根。 转自此文
    也就是说如果根节点的val相等时,跳入到isSame中进行计算,顺着根同时遍历两棵树,看是两棵树否相同;
    若isSame返回false,就回到isSubtree中,对左右子树继续计算,寻找到一致的根节点再跳到isSame中判断,若左右子树都找不到,返回false。
     
    简单说来就是先在T1中定位与T2的根相同的节点,找到根节点后顺藤摸瓜挨个对比结点,若不相同返回,在T1左右子树中继续定位与T2的根相同的节点,重复以上过程。
     
    AC代码
    /**
     * Definition of TreeNode:
     * class TreeNode {
     * public:
     *     int val;
     *     TreeNode *left, *right;
     *     TreeNode(int val) {
     *         this->val = val;
     *         this->left = this->right = NULL;
     *     }
     * }
     */
    
    class Solution {
    public:
        /**
         * @param T1: The roots of binary tree T1.
         * @param T2: The roots of binary tree T2.
         * @return: True if T2 is a subtree of T1, or false.
         */
        bool isSubtree(TreeNode * T1, TreeNode * T2) {
            // write your code here
         if (T2==NULL)
         {
             return true;
         }
        if (T1==NULL)
        {
            return false;
        }
    
        if (T1->val==T2->val)
        {
            if (isSame(T1,T2))
            {
                return true;
            }    
        }
        if (isSubtree(T1->left,T2))
        {
            return true;
        }
        if (isSubtree(T1->right,T2))
        {
            return true;
        }
         return false;
        }
        
        bool isSame(TreeNode *T1,TreeNode *T2)
    {
        if (T1==NULL&&T2==NULL)
        {
            return true;
        }
        if (T1==NULL&&T2!=NULL||T1!=NULL&&T2==NULL)
        {
            return false;
        }
    
        if (T1!=NULL&&T2!=NULL&&(T1->val==T2->val))
        {
            return isSame(T1->left,T2->left)&&isSame(T1->right,T2->right);
        }
        else 
        {
            return false;
        }
        
    }
    };
     
     
     
    
    
  • 相关阅读:
    TYVJ1061 Mobile Service
    TYVJ1061 Mobile Service
    KMP 模板
    poj 3254 Corn Field
    poj 3254 Corn Field
    洛谷1279 字串距离
    poj 1041 John's trip——欧拉回路字典序输出
    bzoj 3033 太鼓达人——欧拉图搜索
    bzoj 2503 相框——思路
    bzoj 2935 [Poi1999]原始生物——欧拉回路思路!
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9195601.html
Copyright © 2011-2022 走看看