数据结构(树)

本文探讨了数据结构的核心概念,强调了算法特别是时间复杂度和空间复杂度在效率中的作用,详细讲解了树类型及其遍历方法,还重点介绍了红黑树的构造、特性及其在优化中的角色。
摘要由CSDN通过智能技术生成

引言:什么是数据结构?

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

数组、链表、树、图……统称为数据结构,数据结构研究数据在内存当中如何高效存储。

数据结构产生的原因?

由于应用问题的复杂程度不断增加、信息量剧增与信息范围的拓宽,导致程序规模越来越大,程序结构更加复杂,为了解决这些问题必须研究数据之间的关系,数据结构由此而生。

与数据结构相生的叫算法

什么是算法
算法即解决问题的方法。

算法的评判标准:空间复杂度和时间复杂度。

时间复杂度:反映算法的计算量(只是个大概概念,并不精确)

空间复杂度:反映算法所消耗的空间大小。

由于时间复杂度远比空间复杂度重要,所以我们着眼于时间复杂度进行研究。

时间复杂度主要分为五种:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2)4

假设一个算法处理的数据总量是n(n足够大),为了增删改查等目的,消耗计算次数y,那么y与n满足以下关系式

y = a ----> O(1)

y = a*logn ----> y = logn ----> O(logn)

y = a*n + b ----> y = n ----> O(n)

y = a*n^2 + b*n + c ----> y = n^2 ----> O(n^2)


接下来,我们讲述一个简单的数据结构---------

 

树的定义
树是n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:

有且仅有一个特定的称为根的结点。
当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
显然,树的定义是递归的,即在树的定义中又用到了自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:

树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
树中所有结点可以有零个或多个后继。
因此n个结点的树中有n-1条边

1、二叉树

几个特殊的二叉树
(1)斜树
所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。

(2)满二叉树
一棵高度为h hh,且含有2 h − 1 2^h-12 
h
 −1个结点的二叉树称为满二叉树,即树中的每层都含有最多的结点。满二叉树的叶子结点都集中在二叉树的最下一层,并且除叶子结点之外的每个结点度数均为2 22。可以对满二叉树按层序编号:约定编号从根结点(根结点编号为1 11)起,自上而下,自左向右。这样,每个结点对应一个编号,对于编号为i的结点,若有双亲,则其双亲为i / 2 i/2i/2,若有左孩子,则左孩子为2 i 2i2i;若有右孩子,则右孩子为2 i + 1 2i+12i+1。


(3)完全二叉树
高度为h hh、有n nn个结点的二叉树,当且仅当其每个结点都与高度为h hh的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树,如图所示。其特点如下:
若i ≤ n / 2 i≤n/2i≤n/2, 则结点i ii为分支结点,否则为叶子结点。
叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上。
若有度为1 11的结点,则只可能有一个,且该结点只有左孩子而无右孩子(重要特征)。
按层序编号后,一旦出现某结点(编号为i ii)为叶子结点或只有左孩子,则编号大于i ii的结点均为叶子结点。
若n nn为奇数,则每个分支结点都有左孩子和右孩子;若n nn为偶数,则编号最大的分支结点(编号为n / 2 n/2n/2)只有左孩子,没有右孩子,其余分支结点左、右孩子都有。
(4)二叉排序树
左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字;左子树和右子树又各是一棵二叉排序树。

(5)平衡二叉树
树上任一结点的左子树和右子树的深度之差不超过1

遍历树:(递归代码)

先序遍历:根左右

public static void add(TreeNond root) {
		if(root==null) {
			return;
		}
        sout(root.value);
		add(root.left);
		add(rot.right);
	
	}
	

中序遍历:左根右

public static void add(TreeNond root) {
		if(root==null) {
			return;
		}
		add(root.left);
		sout(root.value);
		add(rot.right);
	
	}
	

后序遍历:左右根

public static void add(TreeNond root) {
		if(root==null) {
			return;
		}
		add(root.left);
		add(rot.right);
        sout(root.value);
	
	}
	

层次遍历:从上到下,从左到右,一层一层的遍历

树有多高,就遍历几回
//   迭代写法
// 通过构建节点来建立一份二叉树
//           1
//         /  \
//        2    3
//       / \  / \
//      4  5 6   7
    //第一遍:1  头不为空入队列节点1,根节点1左右不为空,统统录入队列中,此时size长为:2
    //第二遍:1,2,3  打印2,入2的左右节点到队列中,打印3,入3的左右节点到队列中,此时size长为:4
    //第三遍:1,2,3,4,5,6,7  打印 4,5,6,7,由于他们都没有左右节点,此时size长为:0,循环结束

public static void levelOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while(!queue.isEmpty()){
        int size = queue.size();
//        System.out.println("size的大小为:"+size);
        for(int i = 0; i < size; i++){
            TreeNode node = queue.poll();
            System.out.print(node.val + " ");
            if(node.left != null){
                queue.offer(node.left);
            }
            if(node.right != null){
                queue.offer(node.right);
            }
        }
    }
}

 

平衡二叉树

平衡二叉树是二叉排序树的改进版本。在二叉排序树的基础上,要求左右子树高度差的绝对值不能超过1。如果超过1,则通过旋转的方式进行调整。

构建平衡二叉树方法:旋转

 

旋转共分四种:

LL型:原父节点向下变为右子树,原中心节点变为父节点,其余子树按位置重新排列。。

   

RR型:原父节点向下变为左子树,原中心节点变为父节点,其余子树按位置重新排列。

LR型:后两个节点先整体旋转,然后重复LL型旋转。

 

 

 RL型:后两个节点先整体旋转,然后重复RR型旋转。

 

优点:时间复杂度稳定在O(logn)上。

缺点:每次旋转过分消耗计算资源

具体应用

 

 

红黑树

红黑树来源于多叉树 ----> 本质上来源于2 3 4树。

2 3 4树(即4阶B树)指一个节点最多分出4个杈的树。

2 3 4树由单节点、双节点、三节点组成。

B树的构建是从下向上构建的。

当链表过长,我们将链表变换为红黑树。

 

单节点能分出2个杈

 

双节点能分出3个杈

 

                                                              三节点能分出4个杈

 

举例:

我们给定一组数据,并研究2 3 4树的构建过程。

 

 

 

 

下面将由此2 3 4树构建出红黑树。

单节点只能转换成一个黑色节点。

 

 

双节点有2种构建形式。 

三节点只有固定的转换形式

那么原2 3 4树可以用红黑树表示为:

红黑树的特点:

1、每个节点不是红色的就是黑色的。

2、红黑树的根节点一定是黑色的。

3、红黑树的叶子节点一定是黑色的。

      红黑树的叶子节点并不是我们构建出的叶子节点,如图所示。

4、如果一个节点是红色的,那它的子节点一定是黑色的。

5、从根节点到到该节点的所有叶子节点路径上包含相同数目的黑色节点。

      解释:2 3 4树是从下向上构建的,因此2 3 4树的所有叶子节点都在同一层上,它们的层高是相同的。同时在构建过程当中每一层最多表现出一个叶子节点,每一层都可以被黑色的所取代(红黑旋转后位置可以被取代),因此除去红色节点以后的树本质上和原2 3 4树层高是一样的。

 

为什么红黑树是最优二叉树?

1、稳定,且时间复杂度为O(logn)。

      稳定性的来源:从根节点到任意一个叶子节点所走过的最长路径不会超过最短路径的二倍。

2、构建不需要消耗太多计算资源。

       红黑树通过变色和旋转插入一个新节点,相对简单。

 

 

  • 44
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值