有两三天没写,光做题了,主要还是为了记录学习
今天开始学习了树这种结构
对于树,在计算机中有很多体现的地方,像是文件系统
这里直接记录二叉树的建立、遍历、查找和删除
假设本文的二叉树的例子是三层的,并自上而下,自左而右123456赋值
1、二叉树的建立
首先创建一个树的节点
public class TreeNode {
// 节点的权
int value;
// 左儿子
TreeNode leftNode;
// 右儿子
TreeNode rightNode;
public TreeNode(int value) {
this.value = value;
}
// 设置左儿子
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
}
// 设置右儿子
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
}
然后创建一个树类
public class BinaryTree {
TreeNode root;
// 设置根节点
public void setRoot(TreeNode root) {
this.root = root;
}
}
然后创建树的测试类,并添加节点
public class TestBinaryTree {
public static void main(String[] args) {
// 创建一棵树
BinaryTree bintree = new BinaryTree();
// 创建一个根节点
TreeNode root = new TreeNode(1);
// 把根节点赋给树
bintree.setRoot(root);
// 创建第二层节点
// 创建左节点
TreeNode rootL = new TreeNode(2);
root.setLeftNode(rootL);
// 创建右节点
TreeNode rootR = new TreeNode(3);
root.setRightNode(rootR);
// 创建第三层节点
rootL.setLeftNode(new TreeNode(4));
rootL.setRightNode(new TreeNode(5));
rootR.setLeftNode(new TreeNode(6));
rootR.setRightNode(new TreeNode(7));
树的创建即为节点增加左右儿子节点,由此可以组成一棵树
2、二叉树的遍历
遍历分为三种遍历,分别是前序遍历、中序遍历和后序遍历
这里的前中后在官方解释中指的是对于根节点的前中后,因为树的遍历运用的是递归的思想,所以在递归中会把一个大树,分成一颗颗小树,即只有一个双亲结点和两个儿子节点,所以我认为这里的前中后指的是每个小树的那一个双亲结点,值得注意的是这里我反复强调递归的思想,所谓递归就是化整为一,把一个庞大的问题仅仅想成一个个基础的解决
前序遍历
public void frontShow() {
// 输出自身的value
System.out.println(value);
// 输出左节点的value
if (leftNode != null) {
//将当前节点的左儿子进行前序遍历
leftNode.frontShow();
}
// 输出右节点的value
if (rightNode != null) {
//将当前节点的右儿子进行前序遍历
rightNode.frontShow();
}
}
结果
1
2
4
5
3
6
7
中序遍历
public void midShow() {
if (leftNode != null) {
leftNode.midShow();
}
System.out.println(value);
if (rightNode != null) {
rightNode.midShow();
}
}
结果
4
2
5
1
6
3
7
后序遍历
public void afterShow() {
if (leftNode != null) {
leftNode.afterShow();
}
if (rightNode != null) {
rightNode.afterShow();
}
System.out.println(value);
}
结果
4
5
2
6
7
3
1
从这三段代码不难看出,所谓三种遍历就是对于不同位置的先后输出
3、查找
查找即依据遍历的基础,根据传入的value,返回相同value的节点
这里仅是前序的查找
public TreeNode frontSearch(int i) {
TreeNode target = null;
if (this.value == i) {
return this;
} else {
if (leftNode != null) {
target = leftNode.frontSearch(i);
}
if (target != null) {
return target;
}
if (rightNode != null) {
target = rightNode.frontSearch(i);
}
}
return target;
}
从这里不难看出,几乎(因为我知道的不多所以不敢断定)所有的数据结构的增删改查都是基于查找的
4、删除
删除也是基于遍历的自然也有递归的思想
public void delete(int i) {
TreeNode parent = this;
if (parent.leftNode != null && parent.leftNode.value == i) {
parent.leftNode = null;
return;
}
if (parent.rightNode != null && parent.rightNode.value == i) {
parent.rightNode = null;
return;
}
parent = leftNode;
if (parent != null) {
parent.delete(i);
}
parent = rightNode;
if (parent != null) {
parent.delete(i);
}
}
做删除方法的时候需要注意其他方法会不会变为空指针异常
今天开始了树的学习,越来越感叹人类的强大,我们现在都是站在巨人的肩膀上看向未来的
往事不过五彩斑斓蜻蜓点水,你我呢喃皆随风语四散而去,人来人往只是日常
——网络原创