统计和生成不同的二叉树
来源:互联网 发布:淘宝抢购秒杀要刷新吗 编辑:程序博客网 时间:2024/06/11 06:18
import java.util.*;//统计和生成不同的二叉树public class generateBinaryTree{//二叉树节点的定义 public static class Node{public int value;public Node left;public Node right;public Node(int data){this.value=data;}} //统计可能的二叉树的结构数 public static 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 static List<Node> generateTrees(int n) {return generate(1, n);}//******************************************************** //生成不同的二叉树public static 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> lSubs = generate(start, i - 1);List<Node> rSubs = generate(i + 1, end);for (Node l : lSubs) {for (Node r : rSubs) {head.left = l;head.right = r;res.add(cloneTree(head));}}}return res;}public static 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;}//**************************************************//直观打印二叉树public static void printTree(Node head) {System.out.println("Binary Tree:");printInOrder(head, 0, "H", 17);System.out.println();}public static void printInOrder(Node head, int height, String to, int len) {if (head == null) {return;}printInOrder(head.right, height + 1, "v", len);String val = to + head.value + to;int lenM = val.length();int lenL = (len - lenM) / 2;int lenR = len - lenM - lenL;val = getSpace(lenL) + val + getSpace(lenR);System.out.println(getSpace(height * len) + val);printInOrder(head.left, height + 1, "^", len);}public static String getSpace(int num) {String space = " ";StringBuffer buf = new StringBuffer("");for (int i = 0; i < num; i++) {buf.append(space);}return buf.toString();}//*************************************************public static void main(String[]args){int n = 4;System.out.println(numTrees(n));List<Node> res = generateTrees(n);for (Node node : res) {printTree(node);}}}
阅读全文
0 0
- 统计和生成不同的二叉树
- 统计和生成所有的不同的二叉树
- 二叉树的生成和遍历
- 线索二叉树的生成和遍历
- 二叉树的生成和遍历
- 二叉树的生成和遍历
- 二叉树的生成和递归遍历
- 【二叉树】DFS统计节点和出现的个数
- 不同的二叉查找树
- 不同的二叉查找树
- 不同的二叉查找树
- 不同的二叉查找树
- 二叉树的遍历和生成——Pascal实现
- java和C++类生成的不同
- 生成N个节点随机二叉查找树的函数 具有从1到N的不同的关键字
- 二叉树之树的种类统计
- 逆序数的二叉查找树统计
- 【二叉树】统计成绩出现的次数
- 【Scikit-Learn 中文文档】神经网络模型(无监督)- 无监督学习
- SQL入门 4 规格化过程
- Java基础知识学习之路-01
- Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication
- hdu 2818
- 统计和生成不同的二叉树
- C# string类应用
- 6.jquery插件
- 【Scikit-Learn 中文文档】交叉验证
- 搭建SSM常用配置pom
- 算法训练 整除问题
- Python实现比较有意思的玩意儿
- JavaScript Concurrency.pdf 英文原版 免费下载
- java的反射