写在前面
这是鄙人昨天遇到的一道笔试题,思考了好半天总算是做了出来。今天翻《剑指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 };