代码改变世界

数据结构学习--Java树

2019-11-07 10:36  小花儿鹿  阅读(217)  评论(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;
}
}