定义:
1、满二叉树:一棵深度为k且有2的k次方减1个结点的二叉树称为满二叉树
2、完全二叉树:如果有深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。
性质:
1、二叉树的第i层上至多有2的i-1次方个结点(i>=1)。
2、深度为k的二叉树至多有2的k次方减1个结点(k>=1)。
3、对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
4、具有n个结点的完全二叉树的深度为以2为底n的对数取下限加1。
5、如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1=<i=<n)有:
(1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则双亲PARENT(i)是结点[i/2]
(2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i
(3)如果2i+1>n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i+1.
存储结构:顺序存储结构(数组方式),链式存储结构(二叉链表)
二叉树链表存储方式:
struct BiNode
{
Type
data;
struct BiNode *lchild,*rchild;//左右孩子指针
}BiNode,*BiTree
设计一个算法层序遍历二叉树(同一层从左到右访问)。
思想:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。
void
HierarchyBiTree(BiTree Root)
{
LinkQueue *Q;
// 保存当前节点的左右孩子的队列
InitQueue(Q);
// 初始化队列
if (Root == NULL) return ; //树为空则返回
BiNode *p = Root;
// 临时保存树根Root到指针p中
Visit(p->data);
// 访问根节点
if (p->lchild)
EnQueue(Q,p->lchild);
// 若存在左孩子,左孩子进队列
if (p->rchild)
EnQueue(Q,p->rchild); // 若存在右孩子,右孩子进队列
while (!QueueEmpty(Q)) // 若队列不空,则层序遍历
{
DeQueue(Q,p);
// 出队列
Visit(p->data);// 访问当前节点
if (p->lchild)
EnQueue(Q,p->lchild);
// 若存在左孩子,左孩子进队列
if (p->rchild)
先找到最左边的叶子并把路上遇到的节点一次进栈,然后弹出栈顶的元素(该元素为最左边的叶子)并判断(1)它有没有右节点;
(2)右节点是否被访问过;如果有右节点同时没被访问过,则先压入刚才弹出的元素,然后压入它的右子树,否则访问该节点并设置pre为该节点。
void postOrder2(BinTree *root) //非递归后序遍历