如何用对象实现二叉树结构?

时间:2017-05-12 06:15:55

标签: java list arraylist binary-tree

如何实现“二叉树结构”?

结果应为:

enter image description here

如果字段包含“true”,则两个列表都应添加此元素。如果该字段包含“false”,则只有正确的列表才应添加此元素。我认为没有递归函数,这个方法是不可实现的。

public class Test {

    static List<String> fields = new ArrayList<>();
    static List<Fieldmatrix> list = new ArrayList<>();

    public static void main(String[] args) {

        fields.add("1 : true");
        fields.add("2 : false");
        fields.add("3 : false");    

        permute(new ArrayList<>(),new ArrayList<>(), 0 , fields); 
    }
}

方法:

public static List<List<String>> permute(List<String> fieldsRight, List<String> fieldsLeft, int start, List<String> fields){

    List<List<String>> combinations = new ArrayList<>();

    if (start >= fields.size()) {
        combinations.add(fieldsRight);
        combinations.add(fieldsLeft);
        return combinations;
    }
    List<String> tmpRight = new ArrayList<>();
    List<String> tmpLeft = new ArrayList<>();

    if (fields.get(start).contains("false")){


        fieldsRight.add(fields.get(start));
        tmpRight = new ArrayList<>(fieldsRight);
        tmpLeft = new ArrayList<>(fieldsLeft);

        combinations.addAll(permute(fieldsRight, fieldsLeft, start+1, fields));


    }
    else{

        fieldsRight.add(fields.get(start));
        fieldsLeft.add(fields.get(start));
        tmpRight = new ArrayList<>(fieldsRight);
        tmpLeft = new ArrayList<>(fieldsLeft);

        combinations.addAll(permute(fieldsRight, fieldsLeft, start+1, fields));
    }

    return combinations;
}

我的错误在哪里? 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我理解你的图表的方式,每个节点都有一个数据字段,它是一个布尔列表,以及一个对其他节点的左和右引用:

class Node {
    Map<Integer,Boolean> data;
    Node left;
    Node right;
};

更新

public class Tree {
    private List<Boolean> list;
    private Node left;
    private Node right;

    private static class Node {
        List<Integer> list;
        private Node left;
        private Node right;

        Node(List<Boolean> treeList, List<Integer> list, int start) {
            this.list = list;
            if (start < treeList.size()) {
                List<Integer> leftList = new ArrayList<>(list);
                List<Integer> rightList = new ArrayList<>(list);
                rightList.add(start+1);
                if (treeList.get(start)) {
                    leftList.add(start+1);
                }
                left = new Node(treeList, leftList, start+1);
                right = new Node(treeList, rightList, start+1);
            }
        }

        void print(int indent) {
            for (int i = 0; i < indent; ++i) {
                System.out.print("    ");
            }
            System.out.println(list);
            if (left != null) {
                left.print(indent+1);
            }
            if (right != null) {
                right.print(indent+1);
            }
        }
    }

    public Tree(List<Boolean> list) {
        this.list = new ArrayList<>(list);
        if (!list.isEmpty()) {
            List<Integer> leftList = new ArrayList<>();
            List<Integer> rightList = new ArrayList<>();
            rightList.add(1);
            if (list.get(0)) {
                leftList.add(1);
            }
            left = new Node(list, leftList, 1);
            right = new Node(list, rightList, 1);
        }
    }

    public void print() {
        System.out.println(list);
        if (left != null) {
            left.print(1);
        }
        if (right != null) {
            right.print(1);
        }
    }
}

构建树:

    Tree tree = new Tree(Arrays.asList(true, false, false));
    tree.print();

更新2:输出

[true, false, false]
    [1]
        [1]
            [1]
            [1, 3]
        [1, 2]
            [1, 2]
            [1, 2, 3]
    [1]
        [1]
            [1]
            [1, 3]
        [1, 2]
            [1, 2]
            [1, 2, 3]