数据结构与算法|二叉树

一:二叉树概述

1.术语

2.数组表示

无节点处用null表示

二:二叉树遍历

1.广度优先遍历

2.深度优先遍历

前,中,后指  该节点的出现位置

前序:--左--右

中序:左----右

后序:左--右--

2.1 前中后序遍历

该节点-->左节点--->右节点

中序遍历

左节点--->该节点--->右节点

后序遍历

左节点--->右节点--->该节点

2.2 树的遍历代码实现

(1)构造树节点类

构造树节点类,有两个节点属性(左右节点)

(2)new一颗树(实例化)

(3)递归方法实现前序遍历

(4)递归方法实现中序遍历

(5)递归方法实现中序遍历

2.3 非递归方法实现前中后序遍历

(1)前中序遍历

pop =stack.pop()

对如下树:

第一个if完成,stack栈内存4-2-1.然后往回走,pop()弹出节点4,返回值为被弹出的元素。先打印pop值,再将curr指向节点4的右子树。

再while判断以节点4为root的子树。

中序遍历:

前序遍历:

(2)后序遍历

分析:

左右中:4--7--2--5--6--3

stack:4--2-1

中序方法:通过pop()出栈的值,来遍历中节点的值。

但在后序中,要先遍历右子树,再回到中节点,再考虑是否用pop()该节点

因此对于上述代码:如果要pop(),要先判断左右子树都已经遍历完了(左右子树都是null(节点4,7,5,9)或者上一次pop的节点等于当前栈顶元素的右节点(节点1,2,3)

2.4 (重点)非递归遍历统一代码

三:二叉搜索树

二分查找针对已经排好序的数组

排序的成本很高

二叉搜索树本身排好序,且再插入新节点,也是排好序的

左子树的所有节点的值 < 根节点值 < 右子树的所有的节点的值

查找时间:

比较平衡时,查找时间为对数logn,不平衡时,查找时间为线性

1.构建一棵二叉搜索树

(1)二叉搜素树 类

(2)构建二叉搜索树节点值

(3)实例化

2.功能:根据键key查找值

key是用来比较的。

2.1递归实现

2.2非递归实现--迭代

3.查找最小关键字,并返回其值

查找最小关键字,并返回其值:不断向左走,,直到null

查找最小关键字,并返回其值:不断向右走,,直到null

3.1 递归实现

3.2迭代实现

4.添加新节点(存储key与value)

根据key值在树里找

找到,更新

没找到,找到其父节点:比父节点大,添加为右子树;比父节点小,添加为左子树

4.查找key的前任值与后任值

二叉树的中序遍历,直接是升序排列,可直接前一个与后一个即为前后任值,但不这么用

4.1.查找key的前任值

找前任值:找比他小的值

节点5的前任节点是4.

(1)这里为什么是p.right处前加存储祖先,而不是p.left

因为:要找比当前节点(key)小的。如果是p.left,说明key值比这个值小(这个值比key大,不能保存,非前任值),要找p.right,说明key比这个值大,保存最后一次。

(2)左子树里找最大:以key.left(p.left)为根节点找最大值

右子树里找最小:以key.right(p.right)为根节点找最小值

4.2.查找key的后任值

找后任值:找比他大的值

右子树里找最小:以key.right(p.right)为根节点找最小值

5.删除节点

5.1情况1和2

5.2情况4

(1)细分两种情况

(1)

(2)

(2)实现步骤

a.找后继节点--有右子树,在右子树里找最小--p.left

5.3 合并所有情况

5.4 递归实现

四:平衡二叉树(AVL)

五:红黑树

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值