- 浏览: 3435569 次
- 性别:
- 来自: China
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
二叉树的顺序存储
public class ArrayBinTree<T> { //使用数组来记录该树的所有节点 private Object[] datas; private int DEFAULT_DEEP = 8; //保存该树的深度 private int deep; private int arraySize; //以默认的深度来创建二叉树 public ArrayBinTree() { this.deep = DEFAULT_DEEP; this.arraySize = (int)Math.pow(2 , deep) - 1; datas = new Object[arraySize]; } //以指定深度来创建二叉树 public ArrayBinTree(int deep) { this.deep = deep; this.arraySize = (int)Math.pow(2 , deep) - 1; datas = new Object[arraySize]; } //以指定深度,指定根节点创建二叉树 public ArrayBinTree(int deep , T data) { this.deep = deep; this.arraySize = (int)Math.pow(2 , deep) - 1; datas = new Object[arraySize]; datas[0] = data; } /** * 为指定节点添加子节点。 * @param index 需要添加子节点的父节点的索引 * @param data 新子节点的数据 * @param left 是否为左节点 */ public void add(int index , T data , boolean left) { if (datas[index] == null) { throw new RuntimeException(index + "处节点为空,无法添加子节点"); } if (2 * index + 1 >= arraySize) { throw new RuntimeException("树底层的数组已满,树越界异常"); } //添加左子节点 if (left) { datas[2 * index + 1] = data; } else { datas[2 * index + 2] = data; } } //判断二叉树是否为空。 public boolean empty() { //根据根元素来判断二叉树是否为空 return datas[0] == null; } //返回根节点。 public T root() { return (T)datas[0] ; } //返回指定节点(非根节点)的父节点。 public T parent(int index) { return (T)datas[(index - 1) / 2] ; } //返回指定节点(非叶子)的左子节点。当左子节点不存在时返回null public T left(int index) { if (2 * index + 1 >= arraySize) { throw new RuntimeException("该节点为叶子节点,无子节点"); } return (T)datas[index * 2 + 1] ; } //返回指定节点(非叶子)的右子节点。当右子节点不存在时返回null public T right(int index) { if (2 * index + 1 >= arraySize) { throw new RuntimeException("该节点为叶子节点,无子节点"); } return (T)datas[index * 2 + 2] ; } //返回该二叉树的深度。 public int deep(int index) { return deep; } //返回指定节点的位置。 public int pos(T data) { //该循环实际上就是按广度遍历来搜索每个节点 for (int i = 0 ; i < arraySize ; i++) { if (datas[i].equals(data)) { return i; } } return -1; } public String toString() { return java.util.Arrays.toString(datas); } public static void main(String[] args) { ArrayBinTree<String> binTree = new ArrayBinTree<String>(4, "根"); binTree.add(0 , "第二层右子节点" , false);//是从0位置开始 binTree.add(2 , "第三层右子节点" , false); binTree.add(6 , "第四层右子节点" , false); System.out.println(binTree); } }
二叉树的链表存储
public class TwoLinkBinTree<E> { public static class TreeNode { Object data; TreeNode left; TreeNode right; public TreeNode() { } public TreeNode(Object data) { this.data = data; } public TreeNode(Object data , TreeNode left , TreeNode right) { this.data = data; this.left = left; this.right = right; } } private TreeNode root; //以默认的构造器来创建二叉树 public TwoLinkBinTree() { this.root = new TreeNode(); } //以指定根元素来创建二叉树 public TwoLinkBinTree(E data) { this.root = new TreeNode(data); } /** * 为指定节点添加子节点。 * @param index 需要添加子节点的父节点的索引 * @param data 新子节点的数据 * @param isLeft 是否为左节点 * @return 新增的节点 */ public TreeNode addNode(TreeNode parent , E data , boolean isLeft) { if (parent == null) { throw new RuntimeException(parent + "节点为null,无法添加子节点"); } if (isLeft && parent.left != null) { throw new RuntimeException(parent + "节点已有左子节点,无法添加左子节点"); } if (!isLeft && parent.right != null) { throw new RuntimeException(parent + "节点已有右子节点,无法添加右子节点"); } TreeNode newNode = new TreeNode(data); if (isLeft) { //让父节点的left引用指向新节点 parent.left = newNode; } else { //让父节点的left引用指向新节点 parent.right = newNode; } return newNode; } //判断二叉树是否为空。 public boolean empty() { //根据根元素来判断二叉树是否为空 return root.data == null; } //返回根节点。 public TreeNode root() { if (empty()) { throw new RuntimeException("树为空,无法访问根节点"); } return root; } //返回指定节点(非根节点)的父节点。 public E parent(TreeNode node) { //对于二叉链表存储法,如果要访问指定节点的父节点必须遍历二叉树 return null; } //返回指定节点(非叶子)的左子节点。当左子节点不存在时返回null public E leftChild(TreeNode parent) { if (parent == null) { throw new RuntimeException(parent + "节点为null,无法添加子节点"); } return parent.left == null ? null : (E)parent.left.data; } //返回指定节点(非叶子)的右子节点。当右子节点不存在时返回null public E rightChild(TreeNode parent) { if (parent == null) { throw new RuntimeException(parent + "节点为null,无法添加子节点"); } return parent.right == null ? null : (E)parent.right.data; } //返回该二叉树的深度。 public int deep() { //获取该树的深度 return deep(root); } //这是一个递归方法:每棵子树的深度为其所有子树的最大深度 + 1 private int deep(TreeNode node) { if (node == null) { return 0; } //没有子树 if (node.left == null && node.right == null) { return 1; } else { int leftDeep = deep(node.left); int rightDeep = deep(node.right); //记录其所有左、右子树中较大的深度 int max = leftDeep > rightDeep ? leftDeep : rightDeep; //返回其左右子树中较大的深度 + 1 return max + 1; } } public static void main(String[] args) { TwoLinkBinTree<String> binTree = new TwoLinkBinTree("根节点"); //依次添加节点 TwoLinkBinTree.TreeNode tn1 = binTree.addNode(binTree.root() , "第二层左节点" , true); TwoLinkBinTree.TreeNode tn2 = binTree.addNode(binTree.root() , "第二层右节点" ,false ); TwoLinkBinTree.TreeNode tn3 = binTree.addNode(tn2 , "第三层左节点" , true); TwoLinkBinTree.TreeNode tn4 = binTree.addNode(tn2 , "第三层右节点" , false); TwoLinkBinTree.TreeNode tn5 = binTree.addNode(tn3 , "第四层左节点" , true); System.out.println("tn2的左子节点:" + binTree.leftChild(tn2)); System.out.println("tn2的右子节点:" + binTree.rightChild(tn2)); System.out.println(binTree.deep()); } }
二叉树的三叉链表存储
public class ThreeLinkBinTree<E> { public static class TreeNode { Object data; TreeNode left; TreeNode right; TreeNode parent; public TreeNode() { } public TreeNode(Object data) { this.data = data; } public TreeNode(Object data , TreeNode left , TreeNode right , TreeNode parent) { this.data = data; this.left = left; this.right = right; this.parent = parent; } } private TreeNode root; //以默认的构造器来创建二叉树 public ThreeLinkBinTree() { this.root = new TreeNode(); } //以指定根元素来创建二叉树 public ThreeLinkBinTree(E data) { this.root = new TreeNode(data); } /** * 为指定节点添加子节点。 * @param index 需要添加子节点的父节点的索引 * @param data 新子节点的数据 * @param isLeft 是否为左节点 * @return 新增的节点 */ public TreeNode addNode(TreeNode parent , E data , boolean isLeft) { if (parent == null) { throw new RuntimeException(parent + "节点为null,无法添加子节点"); } if (isLeft && parent.left != null) { throw new RuntimeException(parent + "节点已有左子节点,无法添加左子节点"); } if (!isLeft && parent.right != null) { throw new RuntimeException(parent + "节点已有右子节点,无法添加右子节点"); } TreeNode newNode = new TreeNode(data); if (isLeft) { //让父节点的left引用指向新节点 parent.left = newNode; } else { //让父节点的left引用指向新节点 parent.right = newNode; } //让新节点的parent引用到parent节点 newNode.parent = parent; return newNode; } //判断二叉树是否为空。 public boolean empty() { //根据根元素来判断二叉树是否为空 return root.data == null; } //返回根节点。 public TreeNode root() { if (empty()) { throw new RuntimeException("树为空,无法访问根节点"); } return root; } //返回指定节点(非根节点)的父节点。 public E parent(TreeNode node) { if (node == null) { throw new RuntimeException(node + "节点为null,无法访问其父节点"); } return (E)node.parent.data; } //返回指定节点(非叶子)的左子节点。当左子节点不存在时返回null public E leftChild(TreeNode parent) { if (parent == null) { throw new RuntimeException(parent + "节点为null,无法添加子节点"); } return parent.left == null ? null : (E)parent.left.data; } //返回指定节点(非叶子)的右子节点。当右子节点不存在时返回null public E rightChild(TreeNode parent) { if (parent == null) { throw new RuntimeException(parent + "节点为null,无法添加子节点"); } return parent.right == null ? null : (E)parent.right.data; } //返回该二叉树的深度。 public int deep() { //获取该树的深度 return deep(root); } //这是一个递归方法:每棵子树的深度为其所有子树的最大深度 + 1 private int deep(TreeNode node) { if (node == null) { return 0; } //没有子树 if (node.left == null && node.right == null) { return 1; } else { int leftDeep = deep(node.left); int rightDeep = deep(node.right); //记录其所有左、右子树中较大的深度 int max = leftDeep > rightDeep ? leftDeep : rightDeep; //返回其左右子树中较大的深度 + 1 return max + 1; } } public static void main(String[] args) { ThreeLinkBinTree<String> binTree = new ThreeLinkBinTree("根节点"); //依次添加节点 ThreeLinkBinTree.TreeNode tn1 = binTree.addNode(binTree.root() , "第二层左节点" , true); ThreeLinkBinTree.TreeNode tn2 = binTree.addNode(binTree.root() , "第二层右节点" ,false ); ThreeLinkBinTree.TreeNode tn3 = binTree.addNode(tn2 , "第三层左节点" , true); ThreeLinkBinTree.TreeNode tn4 = binTree.addNode(tn2 , "第三层右节点" , false); ThreeLinkBinTree.TreeNode tn5 = binTree.addNode(tn3 , "第四层左节点" , true); System.out.println("tn2的父节点:" + binTree.parent(tn2)); System.out.println("tn2的左子节点:" + binTree.leftChild(tn2)); System.out.println("tn2的右子节点:" + binTree.rightChild(tn2)); System.out.println(binTree.deep()); } }
发表评论
-
qweqwe
2012-07-11 16:06 1江蛤蟆 一统江湖 -
123123123
2012-07-11 16:04 0<p>法轮</p> -
母牛繁殖问题
2011-12-30 13:08 3833question:农场的母牛寿命是5年,母牛第二年和第四年会繁 ... -
树形显示
2011-07-17 11:26 1637/** 树形结构应用十分广泛。 下面这段代码根据 ... -
求能除尽1至n的最小整数
2011-07-16 02:43 3957为什么1小时有60分钟,而不是100分钟呢?这是历史上的 ... -
java 四则运算 栈的实现
2011-07-15 13:42 13841import java.util.Stack; /* ... -
用1、2、3、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列 要求:"4"不能在第三位,"3"与"5"不能相连。
2011-07-15 12:45 3370用1、2、3、3、4、5这六 ... -
【code】java红黑树
2011-06-28 10:07 3438import java.util.*; publi ... -
【code】java实现排序二叉树
2011-06-27 21:45 2854import java.util.*; publi ... -
【code】java创建哈夫曼树和实现哈夫曼编码
2011-06-27 17:31 12877创建哈夫曼树 主要思想: (1)对List集合中所有节点进 ... -
【code】java实现十种常见内部排序
2011-06-20 19:22 3074常见的内部排序: 下面介绍这十种常见内部排序(都是从 ... -
【code】java二叉树深(先中后)、广遍历
2011-06-19 16:55 1951import java.util.*; publi ... -
【code】java树的实现
2011-06-17 22:20 11948树的父节点存储实现 import java.util. ... -
【code】java栈和队列实现
2011-06-16 22:11 4943顺序栈的实现 import java.util.Arrays ... -
【code】java线性表实现
2011-06-16 21:24 3657顺序线性表的实现 import java.util.A ...
相关推荐
java二叉树源码cuda-word2vec CBOW模型的cuda实现 特征 与 Nvidia GPU 并行加速 对于任意大的训练集需要恒定的内存 流实现不需要训练数据随机访问 自动验证并在训练期间显示验证数据负对数似然 支持自定义词二叉树...
java二叉树源码 来自 . (进行中) root |--- doc | |-- category.md // category for problems in leetcode | |-- problems.tsv // searchable tsv file listing problems from leetcode | |-- road.md // general ...
java二叉树源码从可执行二进制文件中去匿名化程序员的初始文档。 详情见论文: 请引用:(bibtex 条目)@inproceedings{caliskan2018coding,title={当编码风格在编译中幸存时:从可执行二进制文件中去除程序员的...
请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 43.请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46....
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
BinaryTree:二叉树实现源代码: LinkedList:简单的链表实现源代码: 堆栈:基本堆栈实现源代码: 卡片:洗一副卡片。 源代码: 波兰逆向符号:解决问题源代码: 河内塔:解决问题源代码: 排序算法游乐场 ...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
java-leet-code 持续更新leet-code题解 容易(92) # 标题 标签 001 数组哈希表 007 细绳 008 字符串数组 014 字符串数组 019 链表 020 堆 021 链表 026 大批 028 字符串数组 035 数组哈希表 036 数组哈希集 048 ...
请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 119 84.12. 请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 ...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
疯狂的java讲义 源码 课题:《哈夫曼树编码解码》 一、实验内容 运用哈夫曼编码的相关知识对任意文本文件进行编码、解码。 二、需要用的数据结构以及实现思路 需要用到二叉树、HuffMan树、递归等数据结构 二叉树 在...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
5、说明生活中遇到的二叉树,用java实现二叉树 73 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 78 7、写一个Singleton出来。 81 8、递归算法题1 84 9、递归...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、...