由孩子兄弟表示法引出二叉树。
五种形态:空二叉树,只有根节点,根节点有左子树,根节点有右子树,根节点有左子树和右子树
特殊二叉树:
斜树:实际上是一种线性表,全部是左子树或全部是右子树
满二叉树
完全二叉树:按层序编号与满二叉树按层序编号一样,叶子节点只能在最下面两层.
遍历二叉树:
前序遍历:根左右
前序遍历算法--递归算法
void fun_pre(BTree root){
if(root == null){
return;
}
printf("");
fun_pre(child);
fun_pre(right);
}
前序遍历算法--非递归算法
中序遍历:左跟右
前序遍历算法--递归算法
void fun_in(BTree root){
if(root == null){
return;
}
fun_in(child);
printf("");
fun_in(right);
}
中序遍历算法--非递归算法
后序遍历:左右跟
后序遍历算法--递归算法
void fun_in(BTree root){
if(root == null){
return;
}
fun_in(child);
fun_in(right);
printf("");
}
后序遍历算法--非递归算法
二叉树遍历的性质:
同时给定前序遍历和中序遍历可以确定唯一二叉树
同时给定后序遍历和中序遍历可以确定唯一二叉树
同时给定前序遍历和后序遍历
不能确定唯一二叉树
线索二叉树:
利用节点的空指针域,存放指向节点在某种遍历次序下的前驱或后继节点的地址.
线索二叉树相当于是把二叉树变成了双向链表,对插入、删除、查找操作带来了方便。
查找的时间复杂度为线性阶(O(n)).
哈弗曼树:
带权路径和最小的二叉树.
将带权值的节点顺序排列,然后依次取前两个组成一个新的节点,权值小的作左子树,权值大的作右子树,新节点的权值等于两个节点权值和,然后再插入到序列中,重复操作。
哈弗曼编码:按左0又1编码,从根节点到权值节点的路径编码组合.