剑指 Offer 26. 树的子结构

305 阅读1分钟

剑指 Offer 26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

     3
    / \
   4   5
  / \
 1   2
给定的树 B4 
  /
 1 
返回 true,因为 BA 的一个子树拥有相同的结构和节点值。

判断树是否是子结构:

  • 首先要找到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)

};