数据结构学习--Java树
2019-11-07 10:36 小花儿鹿 阅读(218) 评论(0) 编辑 收藏 举报一、为什么需要使用树
有序数组插入数据项太慢,不过查询快,因为存储数据地址都是连在一起的。
链表查找数据太慢,不过插入删除快。
二、路径
顺着连接节点的边从一个节点到另一个节点,所经过的节点顺序排列称为路径。
三、根
树最上面的节点称为根节点。一棵树只有一个根。而且从根到任何节点有且只有一条路径。
四、父节点
每个节点都有一条边向上连接到另一个节点,这个节点就称为是下面这个节点的父节点。
五、子节点
每个节点都有一条边向下连接到另一个节点,下面的节点就是该节点的子节点。
六、叶子节点
没有子节点的节点称为叶子节点。
七、子树
每个节点都可以作为一个子树的根,它和它所有的子节点,子节点的子节点组合在一起就是一个子树。
八、访问
访问一个节点是为了在这个节点上执行一些操作,如查看节点的数据项,但是如果仅仅是经过一个节点,不认为是
访问了这个节点。
九、层
一个节点的层是指从根开始到这个节点有多少代。
十、二叉树
树的每个节点最多只能有两个子节点的树。
Node.java
package com.example.deer;
public class Node {
//数据项
public long data;
//数据项
public String sData;
//左子节点
public Node leftChild;
//右子节点
public Node rightChild;
public Node(long data,String sData){
this.data = data;
this.sData = sData;
}
}
Tree.java
package com.example.deer;
public class Tree {
//根节点
public Node root;
/**
* 插入节点
* @param value
*/
public void insert(long value,String sValue){
//封装节点
Node newNode = new Node(value,sValue);
//引用当前节点
Node current = root;
//引用父节点
Node parent;
//如果root为null,也就是第一次插入的时候
if(root == null){
root = newNode;
return;
}else{
while (true){
//父节点指向当前节点
parent = current;
//如果当前指向的节点数据比插入的要大,则向左走
if(current.data > value){
current = current.leftChild;
if(current == null){
parent.leftChild = newNode;
return;
}
}else{
current = current.rightChild;
if(current == null){
parent.rightChild = newNode;
return;
}
}
}
}
}
/**
* 查找节点
*/
public Node find(long value){
//引用当前节点,从根节点开始
Node current = root;
//循环,只要查找值不等于当前节点的数据项
while(current.data != value){
//进行比较,比较查找值和当前节点的大小
if(current.data > value){
current = current.leftChild;
} else {
current = current.rightChild;
}
if(current == null){
return null;
}
}
return current;
}
}