分治算法
分治,”分而治之”。从字面上理解就是分—治,把大的问题分成小问题,解决一个一个小问题,之后把问题的答案合并起来,就得到大问题的结果。您肯定会在想,这思想这么简单,你不说我也是知道。历史上,秦国通过远交近攻的策略,逐个击破,最后统一六国不也是分治思想的体现吗?
以下用一个二叉树的前序遍历为例,对分治思想在代码上的体现进行说明。
public class PreoderTraversal {
public class TreeNode{
private int val;
public TreeNode left,right;
public TreeNode(int val){
this.val = val;
this.left = this.right = null;
}
}
public ArrayList<Integer> preodertraversal(TreeNode root){
ArrayList<Integer> result = new ArrayList<Integer>();
//退出的条件
if(root == null){
return null;
}
//分:左子树与右子树
ArrayList<Integer> left = preodertraversal(root.left);
ArrayList<Integer> right = preodertraversal(root.right);
//治:把得到的结果合并起来
result.add(root.val);
result.addAll(left);
result.addAll(right);
return result;
}
}
上面的过程可以通过一个递推公式来表示
T(n) = 2<