递归
递归,即函数不断地自己调用自己。其原理在于把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决。
解决过程分为两个阶段:1.递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;2.回归:将获得的最简单的问题所对应的解决方案,逐步返回,依次得到复杂的解。
迭代
迭代,即一个函数不断地调用另一个函数,A调用B。它是要利用变量的原值推送出一个新值。
两者关系
递归中一定有迭代,,是迭代中不一定有递归,大部分可以相互转换。能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出。
实例
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean res = false;
if(root2 == null || root1 == null){
return false;
}else{
if(root1.val == root2.val){
res = subTree(root1,root2);
}
if(res == false){
res = ((HasSubtree(root1.left,root2) || (HasSubtree(root1.right,root2))));
}
}
return res;
}
public boolean subTree(TreeNode root1, TreeNode root2){
if(root2 == null){
return true;
}else if(root1 == null && root2 != null){
return false;
}else{
if(root1.val == root2.val){
return ((subTree(root1.left,root2.left)) && (subTree(root1.right, root2.right)));
}else{
return false;
}
}
}
}
如在实例中,调用HasSubtree的部分为递归,调用subtree的部分则为迭代。