一、递归算法使用场景
递归算法求解问题点的关键
本质:程序调用自身的一种算法。
把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归的三个条件:
- 边界条件
- 递归前进段
- 递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
二、题目分析
2.1 重构二叉树
给出一棵树的中序遍历和后序遍历,请构造这颗二叉树
注意:保证给出的树中不存在重复的节点
- 边界条件
寻找每次递归时中序数组和后序数组的分界值,根据后序的最后一个数找到中序的分界线,根据中序的分界线寻找后序左右子树的分界线。 - 递归前进段
根节点的左子树、右子树 - 递归返回段
数组的下标
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param inorder int整型一维数组
* @param postorder int整型一维数组
* @return TreeNode类
*/
public TreeNode buildTree (int[] inorder, int[] postorder) {
if(inorder.length!=postorder.length||inorder==null)
return null;
return build(inorder, 0, inorder.length-1, postorder, 0, postorder.length-1);
}
public TreeNode build(int[] inorder, int iStart, int iEnd, int[] postorder, int pStart, int pEnd){
if(iStart>iEnd||pStart>pEnd){
return null;
}
TreeNode root=new TreeNode(postorder[pEnd]);
for(int i=iStart; i<=iEnd; i++){
if(inorder[i]==postorder[pEnd]){
root.left=build(inorder, iStart, i-1, postorder, pStart, pStart+i-1-iStart);
root.right=build(inorder, i+1, iEnd, postorder, pStart+i-iStart, pEnd-1);
}
}
return root;
}
}
2.2字符串是否为回文的判断
1、迭代算法:前后寻找字母或数字判断是否相等,遇到其他字符直接跳过
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return bool布尔型
*/
public boolean isPalindrome (String s) {
//1、字符串转为字符数组
if(s.length()==0||s.equals(""))
return true;
char[] ch=s.toCharArray();
//一个从前往后遍历,一个从后往前遍历
int left=0;
int right=ch.length-1;
while(left<right){
//左边的字符找到数字或字母
while((ch[left]<'0'||ch[left]>'9')&&(ch[left]<'a'||ch[left]>'z')&&(ch[left]<'A'||ch[left]>'Z')){
//不是数字或字母时,左边界++
left++;
if(left>=ch.length)
break;
}
while((ch[right]<'0'||ch[right]>'9')&&(ch[right]<'a'||ch[right]>'z')&&(ch[right]<'A'||ch[right]>'Z')){
//不是数字或字母时,右边界--
right--;
if(right<0)
break;
}
if(left>right) break;
int temp=Math.abs(ch[right]-ch[left]);
if(temp==0||temp==32){
left++;
right--;
}else
return false;
}
return true;
}
}