题目链接:树的子结构
题目描述:
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
分析:
此题目需要对树A中的每一个节点进行遍历,直到找到和树B相同的结构。
1)递归对A进行先序遍历:先判断A根节点开始的结构和B结构是否相同。如果不同,再分别判断A的左右子树是否存在和B相同的结构。
2)再写一个函数判断A中节点node和B的情况。该函数中也用递归。
1)如果B==null,说明在B的该分支上已经判断到了最后,路径上的都相等了,return true。
2)如果node==null,说明在A的该分支上判断到了最后,但是此时B同分支上还有节点,return false;
3)如果node.val!==B.val,节点值不相等,return false
4)最后就是node 和 B都不为null,且其val也相等的情况,就需要判断其左右子树,左右子树都为true,结果才是true。
代码如下:
var isSubStructure = function (A, B) {
if (A == null || B == null)
return false;
// 递归实现先序遍历
return isSame(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
function isSame(A, B) {
if (B == null)
return true;
if (A == null || A.val != B.val)
return false;
return isSame(A.left, B.left) && isSame(A.right, B.right);
}
}