前导题:100. 相同的树
回顾一下
判断两棵二叉树相同,根结点相同 且 左子树相同 且 右子树相同。
于是判断如下:
- 根结点都为
null
,返回true
- 根结点不都为
null
,返回false
- 根结点都不为
null
,但是值不相同,返回false
- 根结点都不为
null
,且值相同,继续判断左子树和右子树,需要同时相等。
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
if (p == null || q == null) return false;
if (p.val != q.val) return false;
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
一个树 sub
是不是树 root
的子树,那么可以判断 sub
是否和树 root
的任意子树相等。判断条件由 且 转为 或:
- 两棵树相等
- 或
sub
是root
的左子树 - 或
sub
是root
的右子树
java
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if (root == null && subRoot == null) return true;
if (root == null || subRoot == null) return false;
return isSametree(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
public boolean isSametree(TreeNode r, TreeNode s) {
if (r == null && s == null) return true;
if (r == null || s == null) return false;
if (r.val != s.val) return false;
return isSametree(r.left, s.left) && isSametree(r.right, s.right);
}
}