题目要求:判断大树A中是否有小树B的结构
方法一:先序遍历(dfs)+回溯
解题思路:遍历大树A的每一个节点,找到与B根节点相同的节点。然后开始以B为中心对比剩下节点是否相同。该解题思路的第一句我用的是先序遍历,后一句我用的是回溯法
代码如下:
var isSubStructure = function(A, B) {
//先序遍历(根左右)
const stack=[A]
while(stack.length){
const node=stack.pop()
if(node.right){
stack.push(node.right)
}
if(node.left){
stack.push(node.left)
}
if(node.val==B.val)
{
//找到与B根节点相同的节点
if(recur(node,B)){
return true
}
}
//回溯函数
function recur(nodeA,nodeB){
if(!nodeB){
return true}
}
if(!nodeA||nodeA.val!==nodeB.val){
return false
}
return recur(nodeA.left,nodeB.left)&&(nodeA.right,nodeB.right)
}
return false
};
方法二:回溯(leetcode大佬解法)
解题思路:将方法一中的先序遍历通过回溯来实现
代码如下:
var isSubStructure = function(A, B) {
if(!A||!B){
return false
}
//回溯---不断通过调用isSubStructure 来实现调用recur(A中每个节点,B)
return recur(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B)
//回溯函数
function recur(nodeA,nodeB){
if(!nodeB){
return true}
}
if(!nodeA||nodeA.val!==nodeB.val){
return false
}
return recur(nodeA.left,nodeB.left)&&(nodeA.right,nodeB.right)
}
}
解题思路:两层回溯将迭代法用到淋漓尽致,该题重点体现在遍历二叉树的两种方法---搜索和迭代