刷题-树的子结构

Posted on 2022-02-10 22:00  AcTourist  阅读(42)  评论(0)    收藏  举报

一、题目

 

 

二、题目分析

  1.要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步,在树A中找到和树B的根节点的值一样的节点R;第二步:判断树A中以R为根节点的子树是不是包含和树B一样的结构

  2.因此我们需要遍历A,找到节点R,在判断R为根节点中的子树是不是和B一样的结构;在这里我们可以利用到递归

  3.在递归里,当B为空树的时候,说明B树被遍历到底部了,证明了B树完全存在于A树中,返回true;当A为空树 或者 A的节点和B的节点不一样的时候,返回false

  4.在递归里,我们还需要进行判断:找到的R节点中 我们得知道 在B树里的R 的左节点 是否等于 A树里的R 的左节点;在B树里的R 的右节点是否等于A 树里的R 的右节点;综上所述这里我们用递归解决

  5.在isSubStructure中,我们这里判断A树和B树是否完全相等 或 左边的树包含B树 或 右边的树包含B树

三、代码分析

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} A
 * @param {TreeNode} B
 * @return {boolean}
 */
var find = function(A,B){
    if(!B) return true;
    if(!A || A.val != B.val) return false;
    return find(A.left,B.left) && find(A.right,B.right);
}
var isSubStructure = function(A, B) {
    if(!A||!B) return false;
    
    return find(A,B) || isSubStructure(A.left,B) ||isSubStructure(A.right,B);
};