二叉树和堆-学习笔记

1)树的相关概念

  1. 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6;
  2. 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点;
  3. 非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点;
  4. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点;
  5. 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点;
  6. 兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点;
  7. 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6;
  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4;
  10. 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点;
  11. 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先;
  12. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙;
  13. 森林:由m(m>0)棵互不相交的树的集合称为森林;

2)特殊的二叉树

  • 满二叉树:每一层的结点数都是最大值,若其层数为k,则节点总数为 2^k - 1。
  • 完全二叉树:对于层数为k、结点数为n的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。满二叉树就是一种特殊的完全二叉树。(按照根、左、右的顺序,中间不能有缺的)

3)二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第 i 层上最多有 2^(i-1) 个结点;
  2. 若规定根节点的层数为1,则深度为 h 的二叉树的最大结点数是 2^h - 1;
  3. 对任何一棵二叉树, 如果度为0的叶结点个数为m, 度为2的分支结点个数为n,则有m=n+1;
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2(n+1)
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为 i 的结点有:若i>0,i位置节点的双亲序号:(i-1)/2;若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子;若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

4)二叉树的存储结构

  1. 顺序存储:数组,只适合表示完全二叉树,现实中只有“堆”才会用数组来存储;
  2. 链式存储:链表,每个结点有数据域、左指针、右指针。链式结构除二叉链表外,还有三叉链表,即还有一个指针指向parent,在红黑树等告诫数据结构中会涉及。

5)堆

这里说的堆是一种数据结构,与操作系统虚拟进程地址空间中的堆是两码事,不要混淆。

堆的概念:在一个集合中,将所有元素按照完全二叉树的顺序存储方式(从根节点开始,从左往右,一层一层往下)存储在一个一维数组中,并满足 K(i)<=K(2i+1) 且 K(i)<=K(2i+2) (或者K(i)>=K(2i+1) 且 K(i)>=K(2i+2) )。将根节点最大的堆叫做大堆,根节点最小的堆叫做小堆。

堆的实现:向下调整算法(时间O(N) 空间O(h)) / 向上调整算法(O(N*logN))。

堆排序:升序——建大堆,降序——建小堆。

TopK问题:解决思路:1. 前K个数,见小堆;2. 后N-K个数,依次比较,如果比堆顶大,就替换它进堆;3. 最后该小堆就是最大的前K个。

6)二叉树的遍历

注意在前序、中序、后序的遍历过程中,要递归,进栈帧!层序不用递归,按队列(先进先出)规则即可。

  • 前序:根、左、右
  • 中序:左、根、右
  • 后序:左、右、根
  • 层序:层序遍历就是从所在二叉树的根节点出发,首先访问第1层的树根节点,然后从左到右访问第2层上的节点,接着是第3层的节点,以此类推,自上而下,自左至右逐层访问树的结点。核心思想:上一层出时,带下一层进队,队列为空结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值