思路
本题要写的函数isSubStructure(A,B)的含义是:判断二叉树B是不是二叉树A的子结构。
引入一个函数recur(A,B),其含义为:判断二叉树B是否是二叉树A的子结构,特别规定A的根节点必须和B的根节点相同。
1. isSubStructure(A,B)
临界条件:
如果A为空或者B为空,返回false。
返回值
要判断二叉树B是不是二叉树A的子结构,就要看3个条件,以下任何一个为true,就返回true。
- B是不是A的子结构(保证A,B根节点相同)
- B是不是A的左子树的子结构(保证A.left和B根节点相同)
- B是不是A的右子树的子结构(保证A.right和B根节点相同)
2. recur(A,B)
返回值
返回recur(A.left, B.left)&&recur(A.right, B.right)。
临界条件
- 当节点 B为空:说明树 B已匹配完成,(越过叶子节点),因此返回 true;
- 当节点 A为空:说明已经越过树 A叶子节点,即匹配失败,返回false;
- 当节点 A和 B的值不同,匹配失败,返回 false;
代码
/**
* 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 isSubStructure = function(A, B) {//理解函数意义:判断二叉树B是不是二叉树A的子结构
var recur = function(A, B) {//理解函数意义:判断二叉树B是否是二叉树A的子结构,规定A的根节点必须和B的根节点相同
if(!B) return true;
if(!A) return false;
if(A.val != B.val) return false;
return recur(A.left, B.left)&&recur(A.right, B.right);
}
if(!A || !B) return false;//A或B为空,返回false
//首先看B是不是A的子结构(保证A,B根节点相同)
//然后看B是不是A的左子树的子结构(保证A.left和B根节点相同);看B是不是A的右子树的子结构(保证A.right和B根节点相同)
return recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
};