目录标题
[Q&A] 什么是二叉树?
二叉树基本形态
1、空二叉树
2、一个根节点的二叉树
3、只有左子树的二叉树
4、只有右子树的二叉树
5、有二个子树的二叉树
[Q&A] 什么是 满二叉树?
百度百科词条
国内教程定义: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。
国外(国际)定义: a binary tree T is full if each node is either a leaf or possesses exactly two childnodes.
大意为:如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。
国内满二叉树特征
1、总节点数:2^n-1
(2的n次方-1)
2、第n层节点数: 2^(n-1)
个节点(2的n-1次方)
[Q&A] 什么是 完全二叉树?
百度百科词条
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树
如果对一棵有
n
个结点的完全二叉树的结点按层序编号(注意非下标,从1开始), 则对任一结点i(1≤i≤n)
1、如果i = 1
, 则结点i
是二叉树的根, 无双亲;
2、如果i > 1
, 则节点为叶子节点,其父结点parent(i) 为i/2
.
3、如果2i > n
, 则结点i
无左孩子, 否则其左孩子lchild (i) 是结点2i
;
4、如果2i+1 > n
, 则结点i
无右孩子, 否则其右孩子rchild (i) 是结点2i+1
.
二叉树【前中后】序遍历
三种遍历思想
前序遍历:根结点 —> 左子树 —> 右子树
中序遍历:左子树—> 根结点 —> 右子树
后序遍历:左子树 —> 右子树 —> 根结点
94. 二叉树的中序遍历
Java实现二叉树的前序,中序,后序遍历(迭代,递归两种方法实现)
动画演示+三种实现 94. 二叉树的中序遍历
[Q&A] 什么是 二叉堆?
可把一个无序的完全二叉树调整为二叉堆,它分为两个类型:
1.最大堆:任何一个父节点的值,都大于等于它左右孩子节点的值(堆顶值最大)
2.最小堆:任何一个父节点的值,都小于等于它左右孩子节点的值(堆顶值最小)
对于二叉堆,如下有几种操作:
1、插入节点 :插入位置是完全二叉树最后一个节点,然后逐层上浮。
2、删除节点 :删除位置是完全二叉树的堆顶的节点,然后把最后一个节点补到原本堆顶的位置,然后逐层下沉。
3、构建二叉堆:把一个无序的完全二叉树调整为二叉堆,本质上就是让所有非叶子节点依次下沉
漫画:什么是二叉堆?
如何存储
二叉堆虽是个完全二叉树,但其存储方式并不是链式存储,而是顺序存储,即存储在数组当中。
如果对一个有
n
个结点的完全二叉堆,
1、n=1
表述二叉树有根。堆顶下标:0
2、假设已知左孩子下标是Lchild,则其父节点下标为parent = (Lchild-1)/2
.
3、假设已知右孩子下标是Rchild,则其父节点下标为parent = (Rchild-1)/2
.
4、假设已知父节点的下标是parent,则其左孩子下标为2*parent+1
;右孩子下标为2*parent+2
5、针对节点i (0≤i≤n-1)
,如果2i+1>n-1
, 则结点i无左孩子, 否则其左孩子是结点2i+1
;
6、针对节点i (0≤i≤n-1)
,如果2i+2>n-1
, 则结点i无右孩子, 否则其右孩子是结点2i+2
.