5.3.1 二叉树先/中/后序遍历
1.二叉树递归特性:
1)要么是空二叉树
2)要么由 根结点+左子树+右子树组成
2.遍历的递归特性:
先序——根左右;
中序——左根右;
后序——左右根;
3.举例
先序 :ABDGECF
中序:DGBEAFC
后序:GDEBFCA
先序:前缀表达式:-+a*b-cd/ef
中序:中缀表达式:a+b*c-d-e/f(需要加界限符)
后序:后缀表达式:abcd-*+ef/-
4.代码
struct ElemType{
int value;
}
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍历
void Pre(BiTree T){
if(T!=NULL){
visit(T); //访问根结点
Pre(T->lchild); //递归遍历左子树
Pre(T->rchild); //递归遍历右子树
}
}
//中序遍历
void In(BiTree T){
if(T!NULL)
{
In(T->lchild);
visit(T);
In(T->rchild);
}
}
//后序遍历
void Post(BiTree T){
if(T!NULL){
Post(T->lchild);
Post(T->rchild);
visit(T);
}
}
1)空间复杂度O(n)
2)每个结点都会被路过三次
先序遍历:第一次路过结点时访问;
中序遍历:第二次路过结点时访问;
后序遍历:第三次路过结点时访问。
5.应用:求树的深度
//求树的深度
int TreeDepth(BiTree T){
if(T==NULL){
return 0;
}
else{
int l=TreeDepth(T->lchild);
int r=TreeDepth(T->rchild);
return l>r?l+1:r+1;
}
}
5.3.2二叉树层序遍历
1.算法思想
1)初始化一个辅助队列;
2)根结点入队;
3)若队列非空,则 队头结点出队,访问该结点,将其左右孩子插入队尾;
4)重复3)至队列为空。
2.代码
//二叉树链式存储
struct ElemType{
int value;
}
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//辅助队列
typedef struct LinkNode{//链式队列结点
BiTNode * data; //存指针而不是结点
struct LinkNode *