数据结构(java)----树

来源:互联网 发布:数据采集与处理期刊 编辑:程序博客网 时间:2024/06/05 06:33

什么是树

线性结构中,一个节点至多只有一个头节点,至多只有一个尾节点,彼此连接起来是一条完整的线。

比如链表和数组:

shixin tai shuai le

而树,非线性结构的典型例子,不再是一对一,而变成了一对多(而图则可以是 多对多),如下图所示:

shixinzhang

几个概念:

1)根节点、父亲节点、孩子节点、叶子节点

2)节点的度:

  节点拥有的子树的数目称为节点的度。比如上图中的 3 的度是 2,10 的度是 1,13的度为0 。

3)树的度:

树内各结点度的最大值。上图为2.。

4)节点的层次

从根节点开始算起,根节点算第一层,往后底层。比如上图中,3 的层次是 2,4 的层次是 4。

5)叶子节点:

度为0的节点就是叶子。

6)树的深度或者高度:

树中节点的最大层次称为树的深度或高度,上图为4.

树的两种实现

从上述概念可以得知,树是一个递归的概念,从根节点开始,每个节点至多只有一个父节点,有多个子节点,每个子节点又是一棵树,以此递归。

树有两种实现方式:

  • 数组
  • 链表

数组表示:

我们可以利用每个节点至多只有一个父节点这个特点,使用 父节点表示法 来实现一个节点:

public class TreeNode {    private Object mData;   //存储的数据    private int mParent;   //父亲节点的下标    public TreeNode(Object data, int parent) {        mData = data;        mParent = parent;    }    public Object getData() {        return mData;    }    public void setData(Object data) {        mData = data;    }    public int getParent() {        return mParent;    }    public void setParent(int parent) {        mParent = parent;    }}

上述代码中,使用 角标 来指明父亲节点的位置,使用这个节点组成的数组就可以表示一棵树。

public static void main(String[] args){    TreeNode[] arrayTree = new TreeNode[10];}

用数组实现的树表示下面的树,(其中一种 )结果就是这样的:

shixinzhang

shixinzhang

数组实现的树节点使用角标表示父亲的索引,下面用链表表示一个节点和一棵树:

链表表示的节点:

public class LinkedTreeNode {    private Object mData;   //存储的数据    private LinkedTreeNode mParent;   //父亲节点的下标    private LinkedTreeNode mChild;  //孩子节点的引用    public LinkedTreeNode(Object data, LinkedTreeNode parent) {        mData = data;        mParent = parent;    }    public Object getData() {        return mData;    }    public void setData(Object data) {        mData = data;    }    public Object getParent() {        return mParent;    }    public void setParent(LinkedTreeNode parent) {        mParent = parent;    }    public LinkedTreeNode getChild() {        return mChild;    }    public void setChild(LinkedTreeNode child) {        mChild = child;    }}

使用引用,而不是索引表示父亲与孩子节点。

使用一个 List, 元素是 LinkedTreeNode,就可以表示一棵链表树:

public static void main(String[] args){    LinkedList<LinkedTreeNode> linkedTree = new LinkedList<>();}

这样只需知道 根节点就可以遍历整个树。知道某个节点也可以获取它的父亲和孩子。

树的几种常见分类及使用场景

树,为了更好的查找性能而生。

常见的树有以下几种分类:

  • 二叉树
  • 平衡二叉树
  • B 树
  • B+ 树
  • 哈夫曼树
  • 红黑树




原创粉丝点击