1.遍历
- 线性表遍历从头到尾依次访问
- 先序:先访问根,再依次访问左子树和右子树
中:左中右
后:左右中
①先序遍历
void PreQrder(BiTree T){
if(T!=NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
O(n),n是结点个数
- 先序遍历:第一次路过时访问结点
- 中序遍历:第二次
- 后序:第三次
②中序遍历
void InQrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
③后序遍历
void PostQrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
汇总
2.中序遍历非递归算法
- 1247依次进栈,7出栈访问它,扫描其右结点,无结点进栈
- 4出栈访问,无右结点
- 2出栈访问,右结点5进栈,其所有左结点为空
- 5出栈访问
- 1出栈访问,右结点3进栈,其左结点6进栈
- 6出栈访问,3出栈访问,栈空
- 7425163
void InOrder2(BiTree T){
InitStack(S);BiTree p=T;
while(p||!IsEmpty(S)){
if(p){
Push(S,p);//将p压入栈中
p=p->lchild;//p赋值为p左孩子结点
}
else{
Pop(S,p);//p是用来被出栈元素赋值,带出来的
visit(p);
p=p->rchild;
}
}
}
3.层次遍历
就是一层一层遍历
- 根结点A入队,出队并访问1
- 左子树B入队,右子树C入队
- B出队,访问该结点,有左右子树D,E,入队
- C出队并访问,F入队
- D出队并访问,HI入队
void LevelOrder(BiTree T){
LinkQueue Q;
InitQueue(Q);//初始化一个队列
BiTree p;//创建一个辅助变量
EnQueue(Q,T);//根结点入队
while(!isEmpty(Q)){
DeQueue(Q,p);//出队队首元素
visit(p);//并访问
if(p->lchild!=NULL)//判断左右子树是否非空
EnQueue(Q,p->lchild);
if(p->rchild!=NULL)
EnQueue(Q,p->rchild);
}
}
汇总
4.由遍历序列构造二叉树
单个序列无法确定
①前序+中序遍历序列
-
前序:开头是根结点,中序:根结点左,左子树;右,右子树
-
先序遍历:D,然后中序左边EAF,右边HCBGI
EAF中A先,A为根,左边E,右边F;
②后序+中序
- 后序:最后扫描根结点