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,如需转载请自行联系原作者
目录
相关文章
|
21天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
66 4
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
91 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
27天前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
45 0
|
19天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
27天前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
89 23
|
19天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
42 5
|
18天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
48 1
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
71 16
|
2月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
27天前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
44 0