树的子结构

题目描述

来源于 https://leetcode-cn.com/

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

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

     3
    / \
   4   5
  / \
 1   2

给定的树 B:

   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:

0 <= 节点个数 <= 10000

思路:

以二叉树 A 的每个节点为根,判断二叉树 B 是否为 A 中以该节点为根的二叉树的子结构。因此需要实现一个函数用来判断一个树是否为另一棵树的子结构,另外需要一个函数遍历二叉树的各个节点。

class Solution {
public:
    bool isSubStructure(TreeNode* tree1, TreeNode* tree2) {
        if(tree1 == nullptr || tree2 == nullptr){
            return false;
        }
        return is_sub_structure(tree1, tree2) ||
            isSubStructure(tree1->left, tree2) ||
            isSubStructure(tree1->right, tree2);
    }

    // 判断 tree2 是不是以 tree1 为根节点的树的子结构
    bool is_sub_structure(TreeNode* tree1, TreeNode* tree2){
        if(tree2 == nullptr){
            return true;
        }
        if(tree1 == nullptr){
            return false;
        }
        if(tree1->val != tree2->val){
            return false;
        }
        return is_sub_structure(tree1->left, tree2->left) &&
               is_sub_structure(tree1->right, tree2->right);
    }
};