数据结构 —— 3 树(上)

1 树与树的表示

1.1 什么是树

在这里插入图片描述
在这里插入图片描述
硬盘的文件管理也存在层次关系
为什么要用分层次组织?
分层次组织在管理上具有更高的效率
数据管理的基本操作之一:查找
如何实现有效率的查找?
在这里插入图片描述
在这里插入图片描述
使用一个数组:数组下标为0的地方不存储要查找的一堆值,而存待查找的那个值(哨兵)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置哨兵,不需要每次判断下标是否达到边界
在这里插入图片描述
返回值:
1、等于0:没找到
2、不等于0:找到了
在这里插入图片描述
由此可见,顺序查找效率不高,引出二分查找
在这里插入图片描述
找得到的情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找不到的情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(每次查找范围都是除2除2除2。。。)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 树的定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

树的一些基本术语

在这里插入图片描述
上面的树的度为3
在这里插入图片描述

1.3 树的表示

在这里插入图片描述
用数组实现不容易知道一个节点的父节点子节点等等
在这里插入图片描述
但是树的子节点的个数不好控制,结点的结构不统一
假设A节点有3个子节点,则把其他的节点也都设置为只有3个子节点的相同结构,这样处理起来比较方便,但是这样做会有3n个指针域,只有n-1条边即n-1个指针域非0,会造成2n+1个指针域的空间浪费
所以引入儿子-兄弟表示法
在这里插入图片描述
优点:结构同一,都是2个指针域,空间浪费也不大(空域2n-(n-1)=n+1)
在这里插入图片描述
次子的次子:结果BCG3个节点(假设下图G有兄弟结点)
在这里插入图片描述
长子的长子的长子的长子:经过BEK3个节点(假设K有子结点)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 二叉树及存储结构

2.1 二叉树的定义

在这里插入图片描述
普通的度为2的树无左右之分

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图是完全二叉树
在这里插入图片描述
上图不是完全二叉树

2.2 二叉树几个重要性质

在这里插入图片描述
在这里插入图片描述

2.3 二叉树的抽象数据类型定义

在这里插入图片描述
在这里插入图片描述

2.4 二叉树的存储结构

2.4.1 顺序存储结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4.2 链表存储

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4.3 二叉树的遍历

先序遍历(根左右)

在这里插入图片描述

中序遍历(左根右)

在这里插入图片描述
在这里插入图片描述

后序遍历(左右根)

在这里插入图片描述
在这里插入图片描述
第1次碰到就输出:先序
第2次碰到就输出:中序
第3次碰到就输出:后序
递归是用堆栈实现的

2.4.4 二叉树的非递归遍历(直接使用堆栈)

中序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

先序

在这里插入图片描述
第一次碰到就输出

后序

在这里插入图片描述
在这里插入图片描述

2.4.5 二叉树的层序遍历

二叉树遍历:把二维变为一维
在这里插入图片描述
堆栈是把自己保存起来
队列是保存右儿子
在这里插入图片描述
在这里插入图片描述
A入队
接下来开始做循环

  • 从队列中抛出1个(A)
  • 然后将其左儿子右儿子入队(BC)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4.6 二叉树遍历应用例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过加括号可以解决中缀表达式存在的问题
一个子树的左子树前加左括号,右子树后加右括号
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值