统计和生成所有的不同的二叉树

来源:互联网 发布:java 注解用处 编辑:程序博客网 时间:2024/06/16 13:04
import java.util.LinkedList;import java.util.List;/** * Created by lxw, liwei4939@126.com on 2017/11/7. * 统计和生成所有的不同的二叉树 * 给定一个整数N,N<1代表空树结构,否则代表中序遍历的结果, * 返回可能的二叉树结构有多少种 * * N含义不变,假设二叉树结构有M种,返回M个二叉树的头结点 */public class countAndGenerateBST {    public class Node{        public int value;        public Node left;        public Node right;        public Node(int data){            this.value = data;            this.left = null;            this.right = null        }    }    public int numTrees(int n){        if(n <2){            return 1;        }        int[] num = new int[n+1];        num[0] = 1;        for (int i=1; i< n+1; i++){            for (int j=1; j< i+1; j++){                num[i] += num[j-1] * num[i- j];            }        }        return num[n];    }    public List<Node> generateTrees(int n){        return generate(1, n);    }    public List<Node> generate(int start, int end){        List<Node> res = new LinkedList<Node>();        if(start > end){            res.add(null);        }        Node head = null;        for (int i=start; i< end +1; i++){            head = new Node(i);            List<Node> lSub = generate(start, i-1);            List<Node> rSub = generate(i+1, end);            for (Node l : lSub){                for (Node r : rSub){                    head.left = l;                    head.right = r;                    res.add(cloneTree(head));                }            }        }        return res;    }    public Node cloneTree(Node head){        if(head == null){            return null;        }        Node res = new Node(head.value);        res.left = cloneTree(head.left);        res.right = cloneTree(head.right);        return res;    }}