剑指 Offer 26. 树的子结构
题目:
思路:
1、两个值相等怎么办?
–相等了,继续往下比较,接下来有一个不相等,回到起点和A树的左右节点进行比较。
–相等的话,下面要一直用&&
2、两个值不想等怎么办?
–不想等,上面说了,用||。
3、树结构——递归!
注意:1.不相等,要回到起点进行比较
2.相等和不想等的跳出条件不一样。
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
boolean flag = false;
if(A==null || B==null){
return false;
}
if (A.val == B.val) {
flag = extracted(A, B);
}
// 为什么要使用flag,类似于回溯,错误了,还可以从头开始。
if(!flag){
flag = isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
return flag;
}
private boolean extracted(TreeNode A, TreeNode B) {
if (B == null) {
return true;
}
if (A == null) {
return false;
}
if (!(A.val == B.val)) {
return false;
} else {
return extracted(A.left, B.left) && extracted(A.right, B.right);
}
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
// boolean flag = false;
if(A==null || B==null){
return false;
}
// if (A.val == B.val) {
// flag = extracted(A, B);
// }
// 为什么要使用flag,类似于回溯,错误了,还可以从头开始。
// if(!flag){
return extracted(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
// return flag;
}
private boolean extracted(TreeNode A, TreeNode B) {
if (B == null) {
return true;
}
if (A == null) {
return false;
}
return (A.val == B.val) && extracted(A.left, B.left) && extracted(A.right, B.right);
}
}