交换左右子树的递归算法,

  交换左右子树的递归算法,

  1) 最小的权值的几个( 1, 2, 3, 4)

  2) 假设当前(甲,乙,丙,丁),如果我们能确定权值和刚好大过它的组合,不难找到所有组合按权值和排序

  数据结构

  需要两个结构选择和保留,选择是已经选择的子集合,遗体是要考虑的数

  他们是列表并需要排序,先开始元素放置如下

  算法

  1) 用残余中最小的元素到选择中找到刚好它能大过的元素

  2) 如果找到,交换这两个元素

  3) 如果不能找到,从残余中删除此元素,取下一个元素继续找(就是到1) )

  -能找到的情况

  选择

  包com。PNP。findnextnumber

  导入Java。util。ArrayList

  导入Java。util。收藏;

  公共类NextWeighSum

  ArrayList Integer remains=new ArrayList Integer

  数组列表整数选择=新数组列表整数

  int TOTAL _ COUNT=10

  int SELECT _ COUNT=4;

  void init() {

  for(int I=0;一.总数我)

  遗体。添加(I 1);

  收藏。分类(遗体);

  for(int I=0;我选择_计数;我)

  选择。添加(剩余部分。删除(0));

  }

  /*

  *选择给定子集,需要返回权重和刚好大于当前子集的下一个子集

  */

  布尔选择下一个(){

  while( remains.size() 0) {

  int cur=剩余。get(0);

  int pos=集合。二分搜索法(选择,当前);

  if (pos 0) //binarySearch (-(插入点)- 1)

  pos=(-pos)-1;

  否则{

  System.err.print(不允许相等元素);

  系统。退出(-1);//不允许相等的元素

  }

  如果(pos==0 ) {//这意味着当前元素小于任何在选择,我们就不需要考虑这个元素

  删除(0);

  继续;

  }

  否则{

  int insert _ pos=pos-1;

  remains.set(0,选择。get(insert _ pos));

  选择。set(insert _ pos,cur);

  系统。出去。print( an select-);

  打印(选择);

  返回真实的

  }

  }

  返回错误的

  }

  void selectAll() {

  while (selectNext())

  ;

  }

  静态空的打印(数组列表整数列表){

  int sum=0;

  for(int I=0;我列出。size();i ) {

  总和=列表。get(I);

  系统。出去。打印(列表。get(I));

  }

  系统。出去。println( sum: sum );

  }

  公共静态void main(String[] args) {

  NextWeighSum m=new NextWeighSum();

  m。init();

  m。select all();

  }

  }

  这个算法打算在货郎问题 中使用,货郎问题是选择权值和最小的边集合,试探是否其构成路径。构成则问题解决,否则试探下一个。

交换左右子树的递归算法,