剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
判断树是否是子结构:
- 首先要找到B根节点是否和A的某个节点是否相同,然后从当前相同的节点依次做匹配,全部匹配完毕,则B是A的子结构
var isMatch = function (A , B){
if(A == null)return false
if(B == null)return true
if(A.val != B.val)return false
return isMatch(A.left,B.left) && isMatch(A.right,B.right)
}
- 如果不相同则看B是否为A左子树的子结构,或者看B是否为A右子树的子结构。
完整代码如下:
var isMatch = function(A, B){
if(B == null) return true
if(A == null)return false
if(A.val != B.val) return false
return isMatch(A.left , B.left) && isMatch(A.right, B.right)
}
var isSubStructure = function(A, B) {
if(B == null) return false
if(A == null) return false
if(A.val == B.val && isMatch(A, B)) return true
return isSubStructure(A.left, B) || isSubStructure(A.right, B)
};