题目描述

新
- 双递归
- 递归判断两棵树是否有相同的节点,遇到值相同的节点后,再递归判断是不是子结构。
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if (A == null || B == null) {
return false;
}
if (A.val == B.val && dfs(A, B)) {
return true;
} else {
return isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
}
public boolean dfs(TreeNode A, TreeNode B) {
if (A == null && B == null) {
return true;
}
if (A == null) {
return false;
}
if (B == null) {
return true;
}
if (A.val == B.val) {
return dfs(A.left, B.left) && dfs(A.right, B.right);
} else {
return false;
}
}
}
思路
- 递归判断两棵树是否有相同的节点,遇到值相同的节点后,再递归判断是不是子结构。
- 递归判断是不是子结构的思路,维护两个boolean,left right
- A.val != B.val 必然不是
- A.left不空,B.left不空,往下递归
- A.left空 B.left不空,不可能是子结构
- A.left不空 B.left空
- A.left空 B.left空
- right同理

代码
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if (A == null || B == null) {
return false;
}
if (A.val == B.val && isSame(A, B)) {
return true;
} else {
return isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
}
public boolean isSame(TreeNode node1, TreeNode node2) {
boolean left = false;
boolean right = false;
if (node1.val != node2.val) {
return false;
} else {
if (node1.left != null && node2.left != null) {
left = isSame(node1.left, node2.left);
} else if (node1.left == null && node2.left != null) {
return false;
} else {
left = true;
}
if (node1.right != null && node2.right != null) {
right = isSame(node1.right, node2.right);
} else if (node1.right == null && node2.right != null) {
return false;
} else {
right = true;
}
}
return left && right;
}
}