子树

来源:互联网 发布:lovelive动作数据资源 编辑:程序博客网 时间:2024/04/29 13:20

题目:

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

 注意事项

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


思路:

主要分为两个部分,第一步先判断第一个树里面有没有一个节点和第二个数的根节点相等,第二步是判断从第一颗树中找到的节点作为根节点的部分和第二颗树是否等价。

 要想判断一个数是不是另一个数的子树,首先应该找到第一个树里面有没有一个节点和第二个节点的根节点相同。题中没有比较两个根节点的重载函数,所以先判断这两个节点有没有相同的数值。如果有相同的数值就判断以这两个节点作为根节点的树是等价,判断这两个树是否等价的函数之前写过,这里就不再重复。这样就大体完成了一个判断。下面说一下特殊情况。如果T2是T1的子树却不是唯一的如何做呢?依据题目只需要找到一个即可,所以定义一个全局变量sym=0,只要sym=1了就说明找到了,函数就不在进行下去了。

代码:

class Solution {
public:
    /**
     * @param T1, T2: The roots of binary tree.
     * @return: True if T2 is a subtree of T1, or false.
     */
     bool sym=0;
      bool isIdentical(TreeNode* a, TreeNode* b) 
    {
        
       if(a==NULL&&b==NULL) return true;
       if(a==NULL&&b!=NULL||a!=NULL&&b==NULL||a->val!=b->val)
        return false;
      return  isIdentical(a->left,b->left)&&isIdentical(a->right,b->right);
    }
    
    void findroot(TreeNode *T1,TreeNode *T2)
    {   if(T1==NULL||sym==true)
        return ;
        if(T1->val==T2->val)
        sym=isIdentical(T1,T2);
        findroot(T1->left,T2);
        findroot(T1->right,T2);
    }
   
    bool isSubtree(TreeNode *T1, TreeNode *T2) {
        // write your code here
        if(T2==NULL) return true;
        findroot(T1,T2);
        return sym;
        
    }
};

感想:

一开始想的是定义一个全局变量是指针类型的,一开始赋值NULL,只要是NULL就说明没有找到,如果不是NULL说明找到再判断子数和第二个树是否等价。这种大体思路不错,具体表达是不对的。那样写的话不知道如何return完成结束。

0 0
原创粉丝点击