Skip to content

Latest commit

 

History

History
157 lines (121 loc) · 4.9 KB

剑指Offer_2600_中等_树的子结构.md

File metadata and controls

157 lines (121 loc) · 4.9 KB

树的子结构

last modify

问题简述
输入两棵二叉树A和B,判断B是不是A的子结构(约定空树不是任意一个树的子结构)
详细描述
输入两棵二叉树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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:递归遍历

树的子结构(先序遍历 + 包含判断,清晰图解)

  1. 确定 b 是 a(以 a 为根节点) 的子结构:
    • 如果 b 与 a 是否相等;
    • 递归判断 b 和 a 的左、右子节点是否分别相等
    • 如果 b 比 a 先达到空节点,则 b 是 a 的子结构;
  2. 遍历 A 中的每个节点 a(以任意顺序遍历均可),然后确定 B 是否为 a 的子结构;
Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
        # 题目设定如果原始输入的 B 是空树,则不是 A 的子树
        # 显然当 A 是空树是,B 也不是 A 的子树
        if not B or not A: return False

        def dfs(a, b):
            """同时从 a 和 b 的根节点开始,判断 b 是不是 a 的子树"""
            # 递归中止条件:
            #   如果 b 先于 a 达到空节点,则 b 是 a 的子树;反之不是;所以需要先判断 b
            if not b: return True
            if not a: return False

            if a.val == b.val:  # 如果当前节点值相同,分别递归判断 a 和 b 的左右子树(这里不要求顺序)
                return dfs(a.left, b.left) and dfs(a.right, b.right)
            else:
                return False
        
        # 遍历 A 中的每个节点,判断以其作为根节点,是否包含 B
        #   这里任意遍历顺序都可以,只要能达到 A 中每个节点
        
        # 先序
        # return dfs(A, B) or self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B)
        
        # 中序
        # return self.isSubStructure(A.left, B) or dfs(A, B) or self.isSubStructure(A.right, B)
        
        # 后序
        return self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B) or dfs(A, B)
C++
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if (A == nullptr || B == nullptr) return false;

        return isSubTree(A, B)
            || isSubStructure(A->left, B) 
            || isSubStructure(A->right, B);
    }

    bool isSubTree(TreeNode* A, TreeNode* B) {
        if (B == nullptr) return true; 
        if (A == nullptr) return false;

        if (A->val == B->val) {
            return isSubTree(A->left, B->left) && isSubTree(A->right, B->right);
        } else {
            return false;
        }
    }
};