导读
本篇文章将会简单介绍二叉树的很重要的基础内容,包括五大重要性质、存储方式、四种遍历代码与思想、先序遍历构造二叉树、遍历序列确定二叉树
五大重要性质
1.第i层最多有2的i-1次方个元素
2.深度为k的树最多有2的k次方-1个元素
3.二叉树度为0的结点个数为n0,度为2的结点个数为n2,则n0=n2+1
4.n个结点,完全二叉树,深度为:以2为底n的对数的向下取整加一或者是以2为底n的对数的向上取整
5.i>1时:双亲为i/2的向下取整,右孩子2i,左孩子2i+1
存储结构
对于二叉树最常用的就是链式存储:
typedef struct BiTNode{
int data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
而对于完全二叉树,顺序存储也是一种方案,只不过比较复杂,需要进行一些转换
四大遍历
前中后序遍历就不多说了,在此仅仅以中序遍历为例,给出代码:
Status InorderTraverse(BiTree T)
{
if(T)
{
InorderTraverse(T->lchild);
printf("%d ",T->data);
InorderTraverse(T->rchild);
}
else
return OK;
return OK;
}
然后说一下层序遍历,方法是
建立一个队列,头结点入队
进入循环,条件是队列不空
出队,并用T保存,打印T中的数据
分别入队T的左右孩子
代码:
Status LevelTraverse(BiTree T)
{
QueuePte Q=InitQueue();
EnQueue(Q,T);
while(!QueueEmpty(Q))
{
DeQueue(Q,T);
printf("%d ",T->data);
EnQueue(Q,T->lchild);
EnQueue(Q,T->rchild);
}
printf("\n");
return OK;
}
遍历序列与二叉树构造
先来看先序构造二叉树算法:
Status CreatBinaryTree(BiTree T)
{
char ch;
scanf("%c",&ch);
if(ch==' ')
T=NULL;
else
{
T=(BiTree T)malloc(sizeof(BiTNode));
T->data=ch;
CreatBinaryTree(T->lchild);
CreatBinartTree(T->rchild);
}
return OK;
}
最后再将一个知识点:
由中序遍历序列+任一一个遍历序列求出树的唯一结构:
比如:
先序:a b d e c f g
中序:d b e a f c g
先由先序序列知道,a为整个树的头结点,再中序序列分割成左右树,左边有dbe右边有fcg,回到先序序列,第二个为b,说明dbe中b为根节点,de分别为左右子树,依次类推得到:
a
b c
d e f g