另一棵树的子树(简单难度)

"该博客探讨了一种简单的LeetCode题目,涉及二叉树的子树判断。通过递归比较根节点和子树节点的值及结构,实现了判断一棵树是否为另一棵树的子树的功能。代码中定义了isSameTree方法用于比较两棵树是否相同,isSubtree方法则遍历root以查找subRoot子树。时间复杂度为O(m*n),空间复杂度为O(max{dr,ds}
摘要由CSDN通过智能技术生成

题目概述(简单难度)

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

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

示例 1:
在这里插入图片描述

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

示例 2:
在这里插入图片描述

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false

题目链接
点我进入leetcode

思路与代码

思路展现

这道题目的思路是这样的:
1:判断subRoot和root所在的二叉树本身是不是相同的树,如果是直接返回true即可
2:判断subRoot所在的二叉树是不是root所在的二叉树的左树
3:判断subRoot所在的二叉树是不是root所在的二叉树的右树

代码示例

class Solution {
    
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q != null || p !=null && q == null) {
            return false;
        }
        if(p == null && q == null) {
            return true;
        }
        if(p.val != q.val) {
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root ==null || subRoot == null) {
            return false;
        }
        if(isSameTree(root,subRoot)) {
            return true;
        }
        if(isSubtree(root.left,subRoot)) {
            return true;
        }
        if(isSubtree(root.right,subRoot)) {
            return true;
        }
        return false;
    }
    
}

总结

考察对于二叉树的掌握,也是入门的经典题目
时间复杂度:对于每一个 root 上的点,都需要做一次深度优先搜索来和 subRoot 匹配,假设root有m个节点,subRoot有n个节点,那么时间复杂度为O(m*n),也就是最坏情况下双方都要将二叉树遍历完才可以确认是否为子树.
空间复杂度:假设root的深度为dr,subRoot的深度为ds,任意时刻栈空间的最大使用代价是 O(max {dr, ds}),所以空间复杂度为 O(max {dr, ds}).

判断一个二叉树是否为另一棵树子树,可以采用递归的方法,先判断当前根节点是否相同,若相同则递归判断左右子树是否相同,若不同则递归判断原二叉树的左右子树是否为目标树的子树。 具体实现步骤如下: 1. 判断当前节点是否为空,若为空则返回 false。 2. 判断当前节点是否与目标树的根节点相同,若相同则递归判断左右子树是否相同。 3. 若当前节点与目标树的根节点不同,则递归判断原二叉树的左右子树是否为目标树的子树。 具体实现代码如下(假设 TreeNode 为二叉树节点的数据结构): ``` bool isSubtree(TreeNode* s, TreeNode* t) { if (!s) return false; // 若当前节点为空,返回 false if (isSameTree(s, t)) return true; // 若当前节点与目标树根节点相同,递归判断左右子树是否相同 return isSubtree(s->left, t) || isSubtree(s->right, t); // 若不同,则递归判断原二叉树的左右子树是否为目标树的子树 } bool isSameTree(TreeNode* p, TreeNode* q) { if (!p && !q) return true; // 若两个节点均为空,返回 true if (!p || !q) return false; // 若其中一个节点为空,返回 false if (p->val != q->val) return false; // 若两个节点的值不同,返回 false return isSameTree(p->left, q->left) && isSameTree(p->right, q->right); // 递归判断左右子树是否相同 } ``` 其中 isSameTree 函数用于判断两个节点以及它们的子树是否相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值