链表和树小结
链表和树都是数据结构的一种,它们的结构有类似的地方,节点中都由两个部分组成,一个时数据区域,一个指向其他节点的引用。
对于链表来说,它一般可以分为单链表,循环链表和双向链表。下面是单链表的具体java实现。
单链表中节点类有两个属性,一个是节点的数据内容,另一个是节点的引用。剩下的就是设置节点数据和引用之类的方法。
public class LinkNode{
private Object obj;//数据区域
private LinkNode next;//引用下一个节点
//构造方法,初始化
public LinkNode(Object data,LinkNode next){
this.obj=data;
this.next=next;
}
public Object getData(){
return obj;
}
public LinkNode getNext(){
return next;
}
public void setData(Object data){//设置节点数据
obj=data;
}
public void setNext(LinkNode next){//设置下一个节点
this.next=next;
}
}
有了节点类,我们就可以给这个构造一个链表了,下面是链表的一些方法:
//添加节点的方法
public void addNode(LinkNode NN){
if(root==null){
root=NN;
end=root;
}
else{
end.setNext(NN);//将没加NN之前的节点的引用指向NN
end=NN;//NN为尾节点
}
size++;
}
//在制定位置插入节点的方法
public void insertNode(LinkNode N,int index){
/*如果直接将index前的引用指向被插入的对象,那么原来index后的数据就会丢失,所以要先要将要插入的对象的引用指向index后面的数据,之
后再做第一步*/
LinkNode bb = null;
for(int i=0;i<index-1;i++){
bb=root.getNext();//得到index前的节点
}
N.setNext(bb.getNext());
bb.setNext(N);
size++;
}
//删除制位置的节点
public void deleteNode(int index){
LinkNode bb=null;
for(int i=0;i<index-1;i++){
bb=root.getNext();
}
bb.setNext(bb.getNext().getNext());
size--;
}
相对于链表来说,树只不过是节点中的引用更丰富罢了,一个节点中可以有多个引用指向不同的子节点。而二叉树就是节点最多有两个子树且有左右之分的树。
对于二叉树中的值,我们可以通过前,中,后以及层次遍历取得节点中的值,比如我们构造了一个java二叉树来存储这个算术式:2*10-8/(2+2)。
先构建树:
public class TreeNode <E>{
private TreeNode <E> Parent;
private TreeNode<E> LChild;
private TreeNode<E> RChild;//右孩子
private E e;//节点中的数据对象
public TreeNode(E e){
this.e=e;
}
//设置父节点,左右孩子节点
public TreeNode setParent(TreeNode<E> Parent){
this.Parent=Parent;
return Parent;
}
public TreeNode setLChild(TreeNode<E> LChild){
this.LChild=LChild;
return LChild;
}
public TreeNode setRChild(TreeNode<E> RChild){
this.RChild=RChild;
return RChild;
}
public E getE(){
return e;
}
}
有时候我们可以很简单的这样建树
public class Node <E>{
private E e;
private Node LChild;
private Node RChild;
//这里LChild和RChild直接为节点的属性.
public Node(E e){
this.e=e;
}
}
为了能够中序遍历打出这个算术式,我们按照特定的方式添加节点,那么,对于得到的树,我们如何中序遍历呢?没错,就是递归。
public void traverse(TreeNode node){
if(e!=null){
traverse(node.getLChild());
Str+=(E)node.getE();
Traverse (node.getRChild());
}
else
{ return ;
}
}
以上就是对于树的一些简单介绍,只要认清树和链表节点的组成以及节点与节点之间相互的联系,就能很好的掌握他们。
<!--EndFragment-->
分享到:
相关推荐
树和链表的程序,其中有树的中序遍历,前序遍历,后序遍历,以及使用递归进行各类运算的代码
是树和链表,快跑! 初心 刚用rust写leetcode的时候,一遇到树和链表的题,就满地clone,才能通过编译。后面对rust熟悉了之后,就找到了一些避免多余副本的方法。因为每一个副本都需要消耗内存,克隆的操作可能也会...
很详细的链表和树的操作,包括二叉搜索树的建立与遍历。链表就是一个双向链表的操作
12二叉树树(链表结构).cpp
这个是某公司的一道题,是把二叉查找树 转为双向链表的,我用程序实现了。希望对你有帮助!
* 基于链表实现树结构 */ package dsa; public class TreeLinkedList implements Tree { private Object element;//树根节点 private TreeLinkedList parent, firstChild, nextSibling;//父亲、长子及最大的...
C语言实现的图 树 链表 还是很好的很规范的代码
排序树 变成双向链表排序树
红黑树的链接实现,完成增加,删除结点,寻找前缀后缀节点等。
数组和链表的对比分析 数组和链表.docx
理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系。二叉树的线索化过程是基于对二叉树进行遍历,而线索二叉树上的线索又为相应的遍历提供了方便
二叉排序树变成双向循环链表,二叉排序树变成双向循环链表,二叉排序树变成双向循环链表
Huffman-Coding-Using-... 这是使用 JAVA 中实现的优先队列(使用最小堆)、二叉搜索树和链表等数据结构的霍夫曼编码的实现。 该项目可以对任何类型的文本文件进行无损数据压缩。 应用程序还可以解码以取回原始文件。
二叉排序树(二叉链表、引用).cpp
该红黑树具有双向链表功能,可以顺序,逆向遍历;快速定位查找。实现STL中MAP的功能。附测试代码。
用二叉链表作存储结构。 要求: (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,...
1.用二叉链表作存储结构 (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)计算二叉排序树T查找成功的平均查找长度,输出结果; 2.用顺序表(一维数组...
二叉搜索树 转为 双向链表, 导入eclipse时要改包名package classOne; BST To Double LinkedList change package name,
数据结构课程设计 用顺序和二叉链表作存储结构实现二叉排序树
图+查找+排序+循环链表+循环链表+数组+广义表+二叉树与树的转换+哈夫曼树