[路飞]_leetcode刷题_剑指 Offer 26. 树的子结构

143 阅读1分钟

题目

剑指 Offer 26. 树的子结构

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

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

例如: 给定的树 A:

     3
    / \
   4   5
  / \
 1   2
给定的树 B:

   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

思路1:

判断B是不是A的子树,首先可以知道B的节点数是小于A的。

大致思路是,

  • 前序遍历树A,用树A的每一个节点去和B的根节点比较,
  • 如果相等,则向下递归的去前序遍历两颗树的每一个节点的值,比较每个节点的值。
  • 如果不等,则用A的左子节点和B比较
  • 再不相等,用A的右子节点和B比较

由于B的节点是少于A的,那么

  • 如果B提前遍历结束,则代表是子树
  • 若A提前遍历结束,则代表不是子树
  • 若遍历过程中,发现有节点不相等,也代表不是子树

代码如下:

/**
 * @param {TreeNode} A
 * @param {TreeNode} B
 * @return {boolean}
 */
var isSubStructure = function(A, B) {
    if(A == null || B == null) return false;
    return compare(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B)
};

function compare(A,B){
    if(B == null) return true;
    if(A == null || A.val != B.val) return false;
    return compare(A.left,B.left) && compare(A.right,B.right);
}