一:二叉树概述
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 递归实现