从BST(二叉搜索树)到链表数组

时间:2016-05-15 17:30:48

标签: java tree linked-list binary-tree binary-search-tree

通过从左到右遍历数组并插入每个元素来创建二叉搜索树。这棵树可能不是一棵平衡的树。给定具有不同元素的二叉搜索树,打印可能导致该树的所有可能数组。

为了回答这个问题,我写了以下代码。尽管如此,它似乎并没有打印出所有可能导致树在所有情况下都可能出现的阵列。您认为应该修改什么?

public class Main {

  public static LinkedList<Integer> passed = new LinkedList<>();
    public static LinkedList<BinaryTree> notyet = new LinkedList<>();
    public static ArrayList<LinkedList<Integer>> results = new ArrayList<LinkedList<Integer>>();



public static void main(String args[]) {
    BinaryTree tr = readTree();
    ArrayList<LinkedList<Integer>> result = allSequences(tr);
    for (LinkedList<Integer> l : result){
        for(int elem: l) System.out.print(elem+" ");
        System.out.println("");
    }
}
private static BinaryTree readTree() {
    BinaryTree tr = new BinaryTree(2, null, null);
    tr.left = new  BinaryTree(1, null, null);
    tr.right = new  BinaryTree(3, null, null);
    return tr;
}

public static ArrayList<LinkedList<Integer>> allSequences(BinaryTree tr){
    // implement here
    ArrayList<LinkedList<Integer>> result = new ArrayList<LinkedList<Integer>>();


    findseqs(passed,notyet,tr);
    //result=results.clone();
    for(LinkedList<Integer> sample :results){
        result.add(sample);
    }


    return result;
}


public static void findseqs(LinkedList<Integer> passed, LinkedList<BinaryTree> notyet, BinaryTree tr) {
    passed.add(tr.value);

    if (tr.left != null) notyet.add(tr.left);
  if (tr.right != null) notyet.add(tr.right);

  if (notyet.isEmpty()) {
    results.add(passed);
  }

  for (BinaryTree elem: notyet) {
    LinkedList<Integer> temp = (LinkedList<Integer>) passed.clone();
    LinkedList<BinaryTree> ptemp = (LinkedList<BinaryTree>) notyet.clone();
    ptemp.remove(elem);
    findseqs(temp, ptemp, elem);
  }


  }

1 个答案:

答案 0 :(得分:0)

关于数组的一个原因是,如果A是图中B的祖先,则A在数组中位于B之前。没有其他任何东西可以假设。 因此,数组可以通过以下递归函数生成。

function sourceArrays(Tree t)

  // leafe node
  if t == null
    return empty list;

  r = root(t);
  append r to existing arrays;

  la = sourceArrays(t.left);
  ra = sourceArrays(t.right);

  ac = createArrayCombitations(la, ra);
  append ac to existing arrays;

end

function createArrayCombitations(la, ra)


  foreach a in la
    foreach b in ra
      r = combineArrays(a,b);
      add r to result;
    end
  end

end

function combineArrays(a, b)
  generate all combinations of elements from two array such that order of elements in each array is preserved.
  Ie if x precedes y in a or b the x precedes y in result