首页 > 试题广场 >

判断t1树中是否有与t2树完全相同的子树

[编程题]判断t1树中是否有与t2树完全相同的子树
  • 热度指数:19529 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定彼此独立的两棵二叉树,树上的节点值两两不同,判断 t1 树是否有与 t2 树完全相同的子树。

子树指一棵树的某个节点的全部后继节点

数据范围:树的节点数满足 ,树上每个节点的值一定在32位整型范围内
进阶:空间复杂度: ,时间复杂度
示例1

输入

{1,2,3,4,5,6,7,#,8,9},{2,4,5,#,8,9}

输出

true

备注:

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 * };
 */

/**
 *
 * @param root1 TreeNode类
 * @param root2 TreeNode类
 * @return bool布尔型
 */
 //先找到root2的根在root1中的位置 提取root1中以root2的根为根的子树
 //再判断两个子数是否完全相同
bool preorder(struct TreeNode* root1, struct TreeNode* root2) {
    //static int count = 0;
    if (NULL != root1 && NULL != root2) {
        if (root1->val != root2->val)
            return false;
        return preorder(root1->left, root2->left) &&
               preorder(root1->right, root2->right) ;
        // preorder(root1->left, root2->left);
        // preorder(root1->right, root2->right);
    }
    if (NULL != root1 && NULL == root2)
        return false;
    if (NULL == root1 && NULL != root2)
        return false;
    return true;
}
struct TreeNode* post(struct TreeNode* root,int value) {
    //二叉树查找某个点
    if(NULL==root)
       return NULL;
    struct TreeNode* temp=NULL;
    if(root->left!=NULL){
        temp=post(root->left,value);
        if(temp!=NULL)
           return temp;
    }
    if(root->right!=NULL){
        temp=post(root->right,value);
        if(temp!=NULL)
           return temp;
    }
    
    if(root->val==value)
            return root;
        // post(root->left,value);
        // post(root->right,value);
        //arr[count++] = root->val;
    
    return temp;

}
bool isContains(struct TreeNode* root1, struct TreeNode* root2 ) {
    // write code here
    struct TreeNode* temp=post(root1,root2->val);
    if(temp==NULL){
        return false;
    }
    return preorder(temp,root2);

}

发表于 2023-01-10 20:13:09 回复(0)