算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

  • 动态规划

  • 图

  • 区间

  • 链表

  • 矩阵

  • 字符串

  • 树

    • 二叉树的最大深度
    • 相同的树
    • 翻转二叉树
    • 二叉树中的最大路径和
    • 二叉树的层序遍历
    • 二叉树的序列化与反序列化
    • 另一棵树的子树
      • 题目描述
      • 思路解析
      • C++代码
      • 复杂度分析
    • 从前序与中序遍历序列构造二叉树
    • 验证二叉搜索树
    • 二叉搜索树中第K小的元素
    • 二叉搜索树的最近公共祖先
    • 实现 Trie (前缀树)
    • 添加与搜索单词 - 数据结构设计
    • 单词搜索 II
  • 堆

  • 逻辑思维

  • 目录
  • 树
华南溜达虎
2024-07-08
目录

另一棵树的子树

题目链接: https://leetcode.cn/problems/subtree-of-another-tree/

# LeetCode 572. 另一棵树的子树

# 题目描述

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

举个例子:

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

# 思路解析

首先明确子树的概念,对于下图,subRoot中节点虽然和root中节点的值相等,但是subRoot中节点2的左孩子是NULL,root中节点2的左孩子是节点0,这违反了结构相同,所以subRoot不是root的子树。

明确了子树的概念,此问题的递归步骤如下:

  1. root和subRoot是否相等(root本身也是自己的子树)。
  2. subRoot是否是root->left的子树。
  3. subRoot是否是root->right的子树。

上述三个点只要有一点成立,就说明subRoot是root的子树。

# C++代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        //递归结束的条件,空节点NULL是任意树的子树
        if (!subRoot) return true;
        //递归结束的条件,此时subRoot不为NULL
        if (!root) return false;
        //递归结束的条件
        if (isSameTree(root, subRoot)) return true;
        //子问题
        return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
    }

    bool isSameTree(TreeNode* p, TreeNode* q) {
        //递归结束的条件
        if (!p && !q) {
            return true;
        }
        //递归结束的条件
        if (!p || !q || p->val != q->val) {
            return false;
        }
        //子问题
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
};

# 复杂度分析

时间复杂度: 由于s的每一个节点都要与t进行去匹配,所以时间复杂度为 O(ST),其中S为s的节点数量,T为t的节点数量。

空间复杂度: 匹配的过程用到了递归,递归会用到函数栈,栈的最大长度基本和t的高度一致,故空间复杂度和t的高度相关。

上次更新: 2024/07/08, 20:31:33
二叉树的序列化与反序列化
从前序与中序遍历序列构造二叉树

← 二叉树的序列化与反序列化 从前序与中序遍历序列构造二叉树→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式