我对树的浅显理解

86 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

树的预备知识即前言

你以为我会在这成列一些树的定义吗,不会的,像上面树的child,根节点,以及深度,后移,祖先这些我都不会在这里写的,因为这是列了也不会有人认真看(包括我)。所以希望我自己看书找下就好了。

树的优点

相信学过数据结构的你,早就知道了链表容易修改,但是查找的速度比较慢,数组的查询速度较快,但是他的修改不非常的方便。那么有没有集大成者集中了了这两者的优点,肯定是有的那就是树。像数据库的索引就是创建一个b树或者b+树来去加快对该字段的搜索。除此之外,像二叉树,Huffman树这些在实际的程序开发中和现实场景中有着巨大的用处。

树的构建

树的构建一般有两种方式,一般来说都是用链表来表示树,但是用顺序结构存储完全二叉树也不是不行,还有大顶堆和小顶堆这些。就让我们先看见一个最简单的树节点类。

class TreeNode
{
    Object element;
    TreeNode firstChild;
    TreeNode NextSibling;
    
}

像这样就是最简单的一个节点类,但是在这个基础上我们可以去对节点类加一点Comparable接口实现一下对应的方法,在通过一点小小的修改就可以构造一个具有特殊结构的树。

二叉树

对于二叉树来说,我们光从名字就可以知道,他的分叉最多只有两个,这就意味着他的子节点也最多只有两个,下面我将介绍一个二叉树的例子。

表达式树

表达式树(expression Tree)。在这棵树中,树叶都是到时操作数,而节点那里一些操作符就是一些操作符如加减乘除这些。对于这棵树而言不同的遍历方式对应着不同的表达式。当是前序遍历时就是前缀表达式计算,以此类推。接下来说下创建过程。我们先读取一个表达式(前缀中缀后缀都可以),然后如果是数就压入栈中看成单节点数,但是如果是操作符的话就栈弹出两个数来构建一个子树,然后在入栈,不断重复这个过程即可。最后就会出来一颗表达式树。

总结

树的内容还有许多,下次再作说明