目录
二叉树的定义
一个二叉是一个有穷的结点集合。这个集合可以为空,若不为 ,则是根节点和称为左子树和右子树两个不相交的二叉树组成。
二叉树的性质
二叉树的深度不大于节点数N,平均深度是.
所有节点都有左右子树的二叉树被称为完美二叉树(满二叉树)。
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左至右的顺序进行编号,如果编号为i的结点与满二叉树中的位置相同,则其称为完全二叉树。 完全二叉树的叶结点只能出现在最下层和次下层,且最下层叶结点集中在树的左边。
二叉树的操作
二叉树的遍历
- 中序遍历
void InorderTraversal(BinTree BT)
{
if(BT){
InorderTraversal(BT->Left);
/*此处假设对BT结点的访问就是打印数据*/
printf("%d", BT->Data);
InorderTraversal(BT->Right);
}
}
- 先序遍历
void InorderTraversal(BinTree BT)
{
if(BT){
printf("%d", BT->Data);
InorderTraversal(BT->Left);
InorderTraversal(BT->Right);
}
}
- 后序遍历
void InorderTraversal(BinTree BT)
{
if(BT){
InorderTraversal(BT->Left);
InorderTraversal(BT->Right);
printf("%d", BT->Data);
}
}
- 非递归遍历
以二叉树的中序遍历为例,当遇到一个结点就把它压栈,并去遍历其左子树;当左子树遍历结束后,从栈顶弹出这个结点并访问它,然后按其右指针再去中序遍历该结点的右子树。
void InorderTraversal(BinTree BT)
{
BinTree T;
/*创建空堆栈S,元素类型为BinTree*/
Stack S = CreateStack();
/*从根结点出发*/
T=BT;
while(T || !IsEmpty(S)){
while(T){
Push(S, T);
T = T->Left;
}
/*结点弹出堆栈*/
T = Pop(S);
Printf("%d", T->Data);
/*转向右子树*/
T = T->Right;
}
}
- 层序遍历
void LevellorderTraversal(BinTree BT)
{
Queue Q;
BinTree T;
/*树为空直接返回*/
if(!BT)
return;
Q = CreatQueue();
AddQ(Q, BT);
while(!IsEmpty(Q)){
T = DeleteQ(Q);
/*访问取出队列的结点*/
printf("%d", T->Data);
if(T->Left)
AddQ(Q, T->Left);
if(T->Right)
AddQ(Q, T->Right);
}
}
参考文献:《数据结构》第二版,陈越