写在前面
这是鄙人昨天遇到的一道笔试题,思考了好半天总算是做了出来。今天翻《剑指Offer》时,赫然看了这道题目,不禁佩服作者的逻辑性之强。虽然我们的实现方法大体一致,但我考虑的还不是很全面,代码也写的不够简洁,看来我等还需要好好修炼内功呀。
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
实现思路
首先,使用先序遍历遍历A树,在A树中找到和B树根节点值相同的结点。
然后使用先序遍历+递归来判断B树中的结点是不是在A树中。不要忘了递归的结束条件:如果B树中的结点空了,就返回true。如果是A树中的结点为null,则返回false。
JavaScript代码实现
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function HasSubtree(pRoot1, pRoot2)
{
var res = false;
if(pRoot1 && pRoot2) {
if(pRoot1.val === pRoot2.val) {
res = DoesTree1HavaTree2(pRoot1, pRoot2);
}
if(!res) {
res = HasSubtree(pRoot1.left, pRoot2) || HasSubtree(pRoot1.right, pRoot2);
}
}
return res;
}
function DoesTree1HavaTree2(pRoot1, pRoot2) {
if(!pRoot2) {
return true;
}
if(!pRoot1) {
return false;
}
if(pRoot1.val !== pRoot2.val) {
return false;
}
return DoesTree1HavaTree2(pRoot1.left, pRoot2.left) && DoesTree1HavaTree2(pRoot1.right, pRoot2.right);
}
module.exports = {
HasSubtree : HasSubtree
}; 
京公网安备 11010502036488号