题目概述(简单难度)
给你两棵二叉树 root 和 subRoot 。检验 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}).