二叉树BinaryTree构建测试(无序)
此测试仅用于二叉树基本的性质测试,不包含插入、删除测试(此类一般属于有序树基本操作)。
//二叉树树类
public class BinaryTree { public TreeNode root; //有一个根节点
public static int index; public TreeNode CreateBTree(int[] a) {
TreeNode root = null;
if (a[index] != '#') {
root = new TreeNode(a[index]);
index++;
root.setLChild(CreateBTree(a));
index++;
root.setRChild(CreateBTree(a));
}
return root; } //先序遍历
public void prevOrder(TreeNode root) {
if (root == null) {
return;
}
System.out.print(root.getData() + ",");
prevOrder(root.getLChild());
prevOrder(root.getRChild());
} // 中序遍历
public void midOrder(TreeNode root) {
if (root == null) {
return;
}
midOrder(root.getLChild());
System.out.print(root.getData() + ",");
midOrder(root.getRChild());
} // 后序遍历
public void postOrder(TreeNode root) {
if (root == null) {
return;
}
postOrder(root.getLChild());
postOrder(root.getRChild());
System.out.print(root.getData() + ",");
} // 获取树大小
private int getSize(TreeNode node) {
if (node == null) {
return 0;
} else {
return 1 + getSize(node.leftChild) + getSize(node.rightChild);
}
} /*求二叉树的高*/
public int getHeight() {
return getHeight(this.root);
} private int getHeight(TreeNode node) {
if (node != null) { //左子树和右子树中谁大返回谁
int i = getHeight(node.leftChild);
int j = getHeight(node.rightChild);
return (i > j) ? i + 1 : j + 1;
} else {
return 0;
}
} //获得叶子数
public int getLeaf(TreeNode node) {
if (node == null) {
return 0;
}
if (node.leftChild == null && node.rightChild == null) {
System.out.println("Leaf node: " + node.getData());
return 1;
} else {
return getLeaf(node.leftChild) + getLeaf(node.rightChild);
} } //获得第K层节点数
public int getNodeKNum(TreeNode node, int k) {
if (k == 1) {
if (node == null)
return 0;
System.out.println("K Node:" + node.getData());
return 1;
}
return getNodeKNum(node.getLChild(), k - 1) + getNodeKNum(node.getRChild(), k - 1);
} //查找某个节点
public TreeNode findNode(int data) {
return findNode(this.root, data);
} public TreeNode findNode(TreeNode node, int data) {
if (node == null) {
return null;
} else if (node.getData() == data) {
return node;
}
TreeNode leftNode = findNode(node.getLChild(), data);
if (null != leftNode)
return leftNode;
TreeNode rightNode = findNode(node.getRChild(), data);
if (null != rightNode)
return rightNode;
return null;
} //返回某节点的父节点
public TreeNode getParent(int data) {
return getParent(this.root, data);
} public TreeNode getParent(TreeNode node, int data) {
if (node == null)
return null;
TreeNode childL = node.getLChild();
TreeNode childR = node.getRChild();
if ((childL != null && childL.getData() == data) || childR != null && childR.getData() == data)
return node;
TreeNode parentL = getParent(node.getLChild(), data);
if (parentL != null)
return parentL;
TreeNode parentR = getParent(node.getRChild(), data);
if (parentR != null)
return parentR;
return null;
} //层次遍历,用到队列
public void BTreeLevelOrder() {
TreeNode root = this.root;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
LinkedList<TreeNode> list = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode pre = queue.poll();
list.add(pre);
if (pre.getLChild() != null)
queue.offer(pre.getLChild());
if (pre.getRChild() != null)
queue.offer(pre.getRChild());
}
Iterator<TreeNode> it = list.iterator();
while (it.hasNext()) {
TreeNode cur = it.next();
System.out.print(cur.getData() + ", ");
}
} //判断一棵树是否是完全二叉树(层次遍历的变形)
public boolean isCompleteBTree() {
TreeNode root = this.root;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root); while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node == null)
break;
queue.offer(node.getLChild());
queue.offer(node.getRChild()); }
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
if (cur != null)
return false;
}
return true; } class TreeNode {
private TreeNode leftChild;
private TreeNode rightChild;
private int data; public TreeNode(int data) {
this.data = data;
} public void setLChild(TreeNode left) {
this.leftChild = left;
} public void setRChild(TreeNode right) {
this.rightChild = right;
} public void setData(int data) {
this.data = data;
} public int getData() {
return this.data;
} public TreeNode getLChild() {
return this.leftChild;
} public TreeNode getRChild() {
return this.rightChild;
}
} public static void main(String[] agrs) {
BinaryTree tree = new BinaryTree();
int[] a = new int[]{1, 2, 3, '#', '#', 4, '#', '#', 5, 6, '#', '#', '#'};
// int[] a = new int[]{1, 2, '#', 3, '#', '#', 4, '#', 5, 6, '#', '#', '#'};
// 1
// / \
// 2 5
// / \ / \
// 3 4 6 #
// / \ / \ / \
// # # # # # #
tree.root = tree.CreateBTree(a);
System.out.print("先序遍历:");
tree.prevOrder(tree.root);
System.out.print("\n中序遍历:");
tree.midOrder(tree.root);
System.out.print("\n后序遍历:");
tree.postOrder(tree.root);
System.out.println(); System.out.println("Tree size Num: " + tree.getSize(tree.root));
System.out.println("Tree Leaf Num: " + tree.getLeaf(tree.root));
System.out.println("K=2 num: " + tree.getNodeKNum(tree.root, 2));
System.out.println("Tree height: " + tree.getHeight()); System.out.println("3 find: " + tree.findNode(3).getData());
System.out.println("1 find: " + tree.findNode(1).getData());
System.out.println("6 find: " + tree.findNode(6).getData());
System.out.println("7 find: " + tree.findNode(7)); System.out.println("6 parent node is : " + tree.getParent(6).getData());
System.out.println("3 paren node is : " + tree.getParent(3).getData());
System.out.println("5 paren node is : " + tree.getParent(5).getData());
System.out.println("1 paren node is : " + tree.getParent(1));
System.out.print("层序遍历:");
tree.BTreeLevelOrder();
System.out.println(); System.out.println("the tree is complete? " + tree.isCompleteBTree()); }
}
二叉树BinaryTree构建测试(无序)的更多相关文章
- 软件测试之构建测试---BVT
1. 构建的基本流程: a. 开发人员在他们的个人计算机上编写源代码文件 b. 他们将编写好的文件存放在一个统一集中的地方,构建组将所有的源代码编译成可以在计算机上运行的二进制文件,且用安装工具把各种 ...
- java实现二叉树的构建以及3种遍历方法
转载自http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿 ...
- docker构建测试环境
构建测试环境首先要根据自己的需求,构建出适合自己项目的image,有了自己的image,就可以快速的搭建出来一套测试环境了. 下边就说一下构建image的两种方式. 1.DOCKFILE创建文件夹:m ...
- Java 实现二叉树的构建以及3种遍历方法
转载自http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿 ...
- java实现二叉树的构建以及3种遍历方法(转)
转 原地址:http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历 ...
- Maven创建Web工程并执行构建/测试/打包/部署
创建工程基本参考上一篇Java Application工程,不同的是命令参数变了,创建Web工程的命令如下: mvn archetype:generate -DgroupId=com.jsoft.te ...
- Maven的构建/测试/打包
继上一篇http://www.cnblogs.com/EasonJim/p/6809882.html使用Maven创建工程后,接下来是使用Maven进行构建/测试/打包. 在打包之前,先熟悉一下Mav ...
- 数据结构之二叉树的构建C++版
二叉树的构建要注意与链式表的区别,二叉树这里的构建十分低级,每个树只是构建了一个单一的二叉树节点,总体来看是有下向上构建的.用户需要手动去构建自己需要的树,而不是直接去插入数据就到二叉树中了,因为不是 ...
- @vue/cli3+配置build命令构建测试包&正式包
上一篇博客介绍了vue-cli2.x配置build命令构建测试包和正式包,但现在前端开发vue项目大多数使用新版@vue/cli脚手架搭建vue项目(vue create project-name) ...
随机推荐
- Qt编写自定义控件38-高亮按钮
一.前言 高亮按钮控件,既可以作为类似于交通指示灯使用,也可以作为设备状态指示灯使用,控件内置多套颜色风格,还可以自己设置颜色风格,按钮可以增加文字显示,非常适合需要在状态设备上显示小量的文字展示,按 ...
- 123457123457#0#-----com.yimeng.wangZheChengYu01--前拼后广--成语头脑王者
com.yimeng.wangZheChengYu01--前拼后广--成语头脑王者
- spring redistemplate中setHashValueSerializer的设置
笔者曾经对redis键值使用了不同类型的序列化方法 用过默认值.JdkSerializationRedisSerializer.StringRedisSerializer还用改以下自定类型的序列化工具 ...
- Node.js使用MySQL连接池示例
下面是一个封装好的工具类: var fs = require('fs'); var mysql = require('mysql'); var pool = mysql.createPool({ ho ...
- 安装新版redis4.0.6
看看新版本有那些特性提升,测试用!先安装 网址:https://redis.io/download 获取:wget http://download.redis.io/releases/redis-4. ...
- Netty学习笔记(一)——nio基础
Netty简单认识: 1) Netty 是由JBOSS 提供的一个Java 开源框架. 2) Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I0 程序. 3) ...
- Oracle 数据库 alert日志及trace日志的清理
Oracle 数据库 alert日志及trace日志的清理 方案一: 暂停数据库的trace 登录到数据库 sqlplus / as sysdba 修改参数: SQL> alter system ...
- Java最全锁剖析:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会 ...
- 图数据库neo4j添加算法包
1. 从https://github.com/neo4j-contrib/neo4j-graph-algorithms/releases下载相应版本jar包,放到 C:\Users\Administr ...
- Tree Generator™ CodeForces - 1149C (线段树,括号序列)
大意: 给定括号序列, 每次询问交换两个括号, 求括号树的直径. 用[ZJOI2007]捉迷藏的方法维护即可. #include <iostream> #include <algor ...