c++面试题(11)------输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。

你可以认为树 A 中只要有一棵和 B 结构完全相同的子树,就说明 B 是 A 的子结构。

(约定空树不是任何树的子结构)

示例:

     A             B
     3             4
    / \           /
   4   5         1
  /
 1

输出:true
解释:A 中存在一个子结构与 B 完全相同。

解题思路

这是一个经典的递归 + DFS 搜索问题。
核心思想:
我们分两步来做:

  • 主函数遍历树 A 的每一个节点;
  • 对每个节点,调用辅助函数判断是否以该节点为根的子树与 B 完全相同;
  • 如果找到任意一个匹配的,返回 true;
  • 否则继续查找,直到整个树 A 遍历完为止。

**辅助函数:**判断两棵树是否从当前节点开始完全一致

bool isSame(TreeNode* r1, TreeNode* r2) {
    if (r2 == nullptr) return true;        // B 到底了,匹配成功
    if (r1 == nullptr) return false;       // A 到底但 B 还没到底,失败
    if (r1->val != r2->val) return false;  // 值不同,失败
    // 递归比较左右子树
    return isSame(r1->left, r2->left) && isSame(r1->right, r2->right);
}

实现代码

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode( int x ) : val( x ), left( nullptr ), right( nullptr ) {}
};

class Solution {
public:
    // 主函数:判断 B 是否是 A 的子结构
    bool isSubStructure( TreeNode* A, TreeNode* B )
    {
        if ( A == nullptr || B == nullptr )
            return false;  // 空树不是任何树的子结构

        // 先尝试从当前节点开始匹配
        if ( isSame( A, B ) )
            return true;

        // 如果不匹配,分别在左子树和右子树中查找
        return isSubStructure( A->left, B ) || isSubStructure( A->right, B );
    }

private:
    // 辅助函数:判断两棵树是否从当前节点开始完全一致
    bool isSame( TreeNode* r1, TreeNode* r2 )
    {
        if ( r2 == nullptr )
            return true;  // B 已经匹配完成
        if ( r1 == nullptr )
            return false;  // A 已经结束,B 还有内容 → 不匹配
        if ( r1->val != r2->val )
            return false;  // 值不相等 → 不匹配

        // 继续递归比较左右子树
        return isSame( r1->left, r2->left ) && isSame( r1->right, r2->right );
    }
};


int main() {
    // 构建测试树 A: 
    //      3
    //     / \
    //    4   5
    //   /
    //  1
    TreeNode* A = new TreeNode(3);
    A->left = new TreeNode(4);
    A->right = new TreeNode(5);
    A->left->left = new TreeNode(1);

    // 构建测试树 B:
    //      4
    //     /
    //    1
    TreeNode* B = new TreeNode(4);
    B->left = new TreeNode(1);

    Solution sol;
    bool result = sol.isSubStructure(A, B);

    std::cout << (result ? "true" : "false") << std::endl;  // 应输出 true

    return 0;
}

你可能感兴趣的:(c++,c++,开发语言)