5.[数据结构和算法分析笔记]树 Tree

简介:

1.树 Tree

定义

树是层次化的而非线性的。

树是由显示结点间关系的边(edge)相联而成的结点(node)集合。

如果树的每个结点都可以有任意数目子结点,则称为一般树。

如果树中每个结点的子结点数目不超过n,则称为n叉树。

如果树中每个结点只有两个子结点,则称为二叉树。

从根开始,沿着连接结点的边从一个结点到另一结点,构成一条路径(path),顺着路径可以到达树中任何一个结点。根和其他任何一个结点之间的路径是唯一的。

二叉树

如果二叉树中的每个叶子结点都恰好有两个子结点,则称为满二叉树。

如果二叉树中除最后一层外其余层都是满的,并且最后一层的叶子是从左向右填满,则称为完全二叉树。

如果n是一个满二叉树中的结点数,h是树的高度,则 

含有n个结点的完全二叉树或满二叉树的高度是log2(n+1)向上取整

树的Java接口

1
2
3
4
5
6
7
8
public  interface  TreeInterface<T> {
     public  T getRootData();
     public  int  getHieght();
     public  int  getNumberOfNodes();
     public  boolean  isEmpty();
     public  void  clear();
                                            
}

树的遍历方法接口

1
2
3
4
5
6
7
public  interface  TreeIteratorInterface<T> {
     public  Iterator<T> getPerorderIterator();
     public  Iterator<T> getPostorderIterator();
     public  Iterator<T> getInorderIterator();
     public  Iterator<T> getLevelOrderIterator();
                                         
}

二叉树的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  interface  BinaryTreeInterface<T>  extends  TreeInterface<T>,
         TreeIteratorInterface<T> {
     /**
      * 将已有的二叉树置为一棵新的单结点的二叉树
      * @param rootData
      */
     public  void  setTree(T rootData);
     /**
      * 将已有的二叉树置为一颗新的二叉树
      * @param rootData 新树的根的数据对象
      * @param leftTree 新树的左子树
      * @param rightTree 新树的右子树
      */
     public  void  setTree(T rootData, BinaryTreeInterface<T> leftTree,
             BinaryTreeInterface<T> rightTree);
}

二叉树的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public  class  BuildBinaryTree {
     // 构建只含一个结点的树
     BinaryTreeInterface<String> dTree =  new  BinaryTree<String>();
     dTree.setTree( "D" );
     BinaryTreeInterface<String> fTree =  new  BinaryTree<String>();
     fTree.setTree( "F" );
     BinaryTreeInterface<String> gTree =  new  BinaryTree<String>();
     gTree.setTree( "G" );
     BinaryTreeInterface<String> hTree =  new  BinaryTree<String>();
     hTree.setTree( "H" );
     // 构建更大的子树
     BinaryTreeInterface<String> eTree =  new  BinaryTree<String>();
     eTree.setTree( "E" , fTree, gTree);
     BinaryTreeInterface<String> bTree =  new  BinaryTree<String>();
     bTree.setTree( "B" , dTree, eTree);
     BinaryTreeInterface<String> cTree =  new  BinaryTree<String>();
     cTree.setTree( "C" , emptyTree, hTree);
     BinaryTreeInterface<String> aTree =  new  BinaryTree<String>();
     aTree.setTree( "A" , bTree, cTree);
}

堆(heap)是其结点含有Comparable的对象并且每个结点含有的对象不小于(或不大于)其后代中的对象的完全二叉树。在最大堆中,结点中的对象大于等于其后代对象。在最小堆中,结点的对象小于等于其后代对象。

最大堆的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  interface  MaxHeapInterface<T  extends  Comparable<?  super  T>> {
     // 将一个新元素插入堆
     public  void  add(T newEntry);
     // 删除并返回堆中最大元素,如果堆为空则返回null
     public  T removeMax();
     // 返回堆中最大的元素,如果堆为空则返回null
     public  T getMax();
     // 检查堆是否为空
     public  boolean  isEmpty();
     // 获得堆的大小
     public  int  getSize();
     // 删除堆中所有元素
     public  void  clear();
}

优先队列

1
2
3
4
5
6
7
8
9
10
public  class  PriorityQueue<T  extends  Comparable<?  super  T>>  implements  PriorityQueueInterface<T>, Serializable {
     private  MaxHeapInterface<T> pq;
     public  PriorityQueue() {
         pq =  new  MaxHeap<T>();
     }
     @Override
     public  void  add(T newEntry) {
         pq.add(newEntry);
     }
}

2.二叉树的结点

二叉树结点的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public  interface  BinaryNodeInterface<T> {
     /**
      * 检索结点的数据部分
      * @return 结点的数据部分中的对象 */
     public  T getData();
     /**
      * 设置结点的数据部分
      * @param newDdata 是一个对象 */
     public  void  setData(T newData);
     /**
      * 检索结点的左(或右)子结点
      * @return 结点的左(或右)子结点 */
     public  BinaryNodeInterface<T> getLeftChild();
     public  BinaryNodeInterface<T> getRightChild();
     /**
      * 将结点的的左子结点设为指定结点
      * @param leftChild 将成为左子结点 */
     public  void  setLeftChild(BinaryNodeInterface<T> leftChild);
     /**
      * 将结点的右子结点设为指定结点
      * @param rightChild 将成为右子结点 */
     public  void  setRightChild(BinaryNodeInterface<T> rightChild);
     /**
      * 检查结点是否有左(或右)子结点
      * @return 如果有左(或右)子结点则返回true */
     public  boolean  hasLeftChild();
     public  boolean  hasRightChild();
     /**
      * 检查结点是不是叶子
      * @return 如果是叶子则返回true */
     public  boolean  isLeaf();
     /**
      * 计算以该结点为根的子树的结点数据
      * @return 返回以该结点为根的子树的结点数目 */
     public  int  getNumberOfNodes();
     /**
      * 计算以该结点为根的子树的高度
      * @return 返回以该结点为根的子树的高度 */
     public  int  getHeight();
     /**
      * 复制以该结点为根的子树
      * @return 返回以该结点为根的子树的根 */
     public  BinaryNodeInterface<T> copy();
}

BinaryNode的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public  class  BinaryNode<T>  implements  BinaryNodeInterface<T>, Serializable {
     private  T data;
     private  BinaryNode<T> left;
     private  BinaryNode<T> right;
     public  BinaryNode() {
         this ( null );
     }
     public  BinaryNode(T dataPortion) {
         this (dataPortion,  null null );
     }
     public  BinaryNode(T dataPortion, BinaryNode<T> leftChild,
             BinaryNode<T> rightChild) {
         data = dataPortion;
         left = leftChild;
         right = rightChild;
     }
     public  T getData() {
         return  data;
     }
     public  void  setData(T newData) {
         data = newData;
     }
     public  BinaryNodeInterface<T> getLeftChild() {
         return  left;
     }
     public  BinaryNodeInterface<T> getRightChild() {
         return  right;
     }
     public  void  setLeftChild(BinaryNodeInterface<T> leftChild) {
         left = (BinaryNode<T>) leftChild;
     }
     public  void  setRightChild(BinaryNodeInterface<T> rightChild) {
         right = (BinaryNode<T>) rightChild;
     }
     public  boolean  hasLeftChild() {
         return  left !=  null ;
     }
     public  boolean  hasRightChild() {
         return  right !=  null ;
     }
     public  boolean  isLeaf() {
         return  (left ==  null ) && (right ==  null );
     }
}










本文转自 LinkedKeeper 51CTO博客,原文链接:http://blog.51cto.com/sauron/1227342,如需转载请自行联系原作者
目录
相关文章
|
10月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
387 4
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
793 1
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
325 2
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
338 17
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
314 0
|
人工智能 算法 语音技术
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
清华大学与腾讯联合推出的Video-T1技术,通过测试时扩展(TTS)和Tree-of-Frames方法,显著提升视频生成的连贯性与文本匹配度,为影视制作、游戏开发等领域带来突破性解决方案。
577 4
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
299 7
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
501 3
 算法系列之数据结构-Huffman树
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
1007 19

热门文章

最新文章