前言
求树的子结构,深入理解递归。
一、递归
1、思想
去匹配树的子结构,第一,匹配第一个节点,若相等就往下比,若不相等,就将root的左孩子节点或者右孩子节点作为起始节点往下比。不断换根节点这是外层循环,往下比就是内层循环。
而树本身就是一个递归结构,递归的本质也是循环,所以通过双递归去替代这两个循环。
1)第一个递归,给了两个根节点,然后dfs往下比,若匹配失败返回false,否则返回true。
2)第二个递归,不断换根节点,第一个递归return false即匹配失败,则换root的左孩子或右孩子继续dfs。
2、源码
public class IsSubStructure26 {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if (A == null || B == null)
return false;
return dfs(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B);
}
public boolean dfs(TreeNode A,TreeNode B){
if(B == null)
return true;
if(A == null || A.val != B.val)
return false;
return dfs(A.left,B.left) && dfs(A.right,B.right);
}
// Definition for a binary tree node.
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
}
总结
树本身就是递归结构,树的遍历递归起来非常简单,然后在遍历上做一些操作就可以了。通过这些操作来熟练掌握树结构和递归思想。