
一:创建一棵二叉树
1.1. 链式存储创建如下二叉树:

1.11创建一棵树:
public static void main(String[] args) {
//创建一棵树
BinaryTree binTree = new BinaryTree();
}
这样就完成了一棵树的创建,可能大家会疑惑,这里面什么都没有,怎么叫创建一棵树呢?
这其实就是一颗空树

1.2二叉树的全部代码:
/**
* 2019年2月15日
*/
package demo5;
/**
* 测试二叉树的类
*
* 2019年2月15日
*/
public class TestBinary {
public static void main(String[] args) {
//创建一棵树
BinaryTree binTree = new BinaryTree();
//创建根节点
TreeNode root =new TreeNode(1);
//把根节点赋给树
binTree.setRoot(root);
//创建左节点
TreeNode NodeL =new TreeNode(2);
//创建右节点
TreeNode NodeR = new TreeNode(3);
//把左右节点添加到根节点
root.setlNode(NodeL);
root.setrNode(NodeR);
}
}
package demo5;
/**
* 创建二叉树:实现添加,查看根节点,添加左右节点
*
* 2019年2月15日
*/
public class BinaryTree {
//根节点
TreeNode root;
//设置根节点
public void setRoot(TreeNode root) {
this.root = root;
}
//获取根节点
public TreeNode getRoot() {
return root;
}
}

/**
* 2019年2月15日
*/
package demo5;
/**
* 二叉树的左右节点
*
* 2019年2月15日
*/
public class TreeNode {
//设置节点的权(值)
int value;
//设置左节点
TreeNode lNode;
//设置右节点
TreeNode rNode;
public TreeNode(int value){
value=this.value;
}
//设置左节点
public void setlNode(TreeNode lNode) {
this.lNode = lNode;
}
//设置右节点
public void setrNode(TreeNode rNode) {
this.rNode = rNode;
}
}
二:二叉树的遍历
2.二叉树的三种遍历
前序遍历:根节点–左节点-右节点
中序遍历:左节点–根节点—右节点
后序遍历:左节点-右节点–根节点
前中后都是相对于根节点而言
无论哪种遍历都是先左后右

对于上图:
前序:1 – 2 – 4 – 5 – 3 – 6 – 7

中序:4 – 2 – 5 – 1 – 6 – 3 --7
后序:4 – 5 – 2 – 6 – 7 – 3 – 1
大家也许已经发现,这是一个递归的思想
2.2.添加遍历的代码:
// 前序遍历
public void frontShow() {
// 先打印自己,然后左节点,之后右节点
System.out.print(value + " ");
// 判断左节点
if (leftNode != null) {
leftNode.frontShow();
}
// 判断右节点
if (rightNode != null) {
rightNode.frontShow();
}
}
// 中序遍历
public void middleShow() {
// 先打印左,然后自己,之后右节点
// 判断左节点
if (leftNode != null) {
leftNode.middleShow();
}
System.out.print(value + " ");
// 判断右节点
if (rightNode != null) {
rightNode.middleShow();
}
}
// 后序遍历
public void afterShow() {
// 先左节点,之后右节点,最后打印自己
// 判断左节点
if (leftNode != null) {
leftNode.afterShow();
}
// 判断右节点
if (rightNode != null) {
rightNode.afterShow();
}
System.out.print(value + " ");
}
2.3注意:在主方法中虽然是调用树的前序遍历

但是树里面的遍历方法并不起作用,而是在节点类写此方法
// 前序遍历
public void frontShow() {
// 他自己也不干事,而是调用root的方法
root.frontShow();
}
最后结果与我们推出的结果相同:


三:节点的查找:本质就是把树遍历一遍,然后找到我们想要的节点,如果有返回该节点,没有返回null
在TestBinary类中添加代码:
//查找树
TreeNode result = binTree.frontSearch(3);
System.out.println(result.equals(rootR));
在BinaryTree类中添加代码:
//前序查找
public TreeNode frontSearch(int i) {
return root.frontSearch(i);
}
在TreeNode类中添加代码:
// 前序查找
//如果查找到值和节点权相同,返回该节点
public TreeNode frontSearch(int i) {
TreeNode target = null;
// 对比当前节点的值
if (this.value == i) {
return this;
} else {
// 查找左儿子
if (leftNode != null) {
// 如果查不到,target仍为空
target = leftNode.frontSearch(i);
}
// 如果不为空,在左儿子中已经找到
if (target != null) {
return target;
}
// 如果左儿子中没有找到
if (rightNode != null) {
target = rightNode.frontSearch(i);
}
return target;
}
}
运行结果,判断无误:

3.1不同方法查找的效率
如果你需要转生,请注意以下几点:\r\n#r1.转生的时候请取下所有装备\r\n2.1级vip会员转生等级为190级(需要3亿)\r\n3.2级vip会员转生等级为180级(需要2亿)\r\n4.3级vip会员转生等级为170级(需要1亿)\r\n5.4级vip会员转生需要160级(需要5千万)\r\n6.普通玩家转生需要200级(需要5亿)\r\n7.每次转生的能力获得比例为:hp/mp=转生次数*50,ap=转生次数*200\r\n#k你当前转生次数为:#r"+cm.getchar().getreborns()+"#k次,是否继续。日本研究者中村经过观察,发现同样的食物同样的量,肥胖男子用8~10分钟吃完,而消瘦者却用13~16分钟吃完,另外他还对食物进行了咀嚼次数调查,肥胖男子需要7.7次,肥胖女子需要8.1次,而普通男子需要8.9次,普通女子需要9.4次。在中国传统的阴阳历中以朔月的长度29.5306日为1个月的平均值,全年12个月,同回归年的长度365.2422日相差约10日21时,需要置闰,使阴阳历各个月份和天象物候保持对应的关系.我国古六历中用3年闰1个月,5年闰2个月,19年闰7个月的闰月法,每逢闰年所加的月便称为“闰月”.闰月放在一年的年终,例如,秦代和西汉初期使用的《颛项历》,以十月为岁首,把九月做为年终,闰月就放在九月之后,而称为“后九月”.到了西汉初制定太初历时,把闰月分插在一年的各月,并规定以没有中气的那几个月作为闰月,月序仍用上个月的月序,只要称其为“闰某月”.这一置闰规则在采用平气的历法中最合理的.到清代的时宪历时,则改用定气注历,如继续单纯以没有中心置闰的规则,有可能一年要置两个闰月.因此,又补充规定:以两次冬至之间包含有13个月的定为闰年,闰年的第一个没有中气的月定为闰月.这一规则一直沿用至今.闰年中以闰四、五、六月最多,闰九、十月最少,闰十一月、十二月和正月则不会出现,至少在几千年内是这样的.。
四:删除子树
4.1删除节点
删除节点也就是删除子树,在删除时会把节点及附带的所有子节点删除。

删除的节点原理也很简单:找到该节点建立二叉排序树,把他设置为空
删除节点分为根节点和普通的子节点两种,使用分支语句写
// 删除子树
public void delete(int i) {
// 分为两类,根节点和子节点
if (root.value == i) {
root = null;
} else {
root.delete(i);
}
}
递归实现杀死节点,每次判断是不是超出背包的重量如果是的话直接截取。那么下面就要说说先序遍历的非递归方式,遍历思想是这样的:先访问根节点在访问左节点, 最后访问右节点。bindlevel :build一个树结构,通过递归循环把当前节点加入到父节点中,形成一个完整的excel一样的树形结构。
//删除子树
public void delete(int i) {
TreeNode parent =this;
//如果根节点不是
if(parent.value==i){
parent=null;
}else{
//判断左儿子
if(parent.leftNode!=null&&parent.leftNode.value==i){
//如果是,直接让他为null
parent.leftNode=null;
return;
}
//判断右儿子
if(parent.rightNode!=null&&parent.rightNode.value==i){
//如果是,直接让他为null
parent.rightNode=null;
return;
}
//如果都不是,往下一层进行
//递归检查并删除左儿子
parent =leftNode;
if(parent!=null){
parent.delete(i);
}
//递归检查并删除右儿子
parent =rightNode;
if(parent!=null){
parent.delete(i);
}
}
}
最后使用遍历方法查看是否成功删除子树(节点及其所有子节点)。
在删除根节点之后,可能会出现 “空指针异常的问题”,这是因为之前在遍历方法中没有写判断语句,
只有先判断有这棵树是否存在,才可以继续查看
// 前序遍历
public void frontShow() {
if (root != null) {
root.frontShow();
} else {
System.out.println("当前树为空树");
}
}
**注意:添加删除之后,查看数据时,一定要加上判断是否为空的语句
**
至此,二叉树的创建,遍历,查找,删除子树就全部实现完成建立二叉排序树,以下为三个类的全部代码:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-115222-1.html
找个退役船撞它