遍历定义:顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次(又称周游)
“访问”的含义很广,可以是对结点作各种处理,如:输出结点的信息、修改结点的数据值等,但要求各种访问不破坏原来的数据结构
遍历目的:得到树的所有结点的一个线性排列
遍历用途:它是树结构插入、删除、修改、查找和排列运算的前提,是二叉树一切运算的基础和核心
遍历二叉树算法描述:
假设:L-遍历左子树 D-访问根节点 R-遍历右子树
若规定从左到右,则有三种情况:
DLR——先(根)序遍历
LDR——中(根)序遍历
LRD——后(根)序遍历
(1)先序遍历二叉树的操作定义:
若二叉树为空,则空操作;否则
1)访问根结点
2)先序遍历左子树
3)先序遍历右子树
(2)中序遍历二叉树的操作定义:
若二叉树为空,则空操作;否则
1)中序遍历左子树
2)访问根结点
3)先序遍历右子树
(3)后序遍历二叉树的操作定义:
若二叉树为空,则空操作;否则
1)后序遍历左子树
2)后序遍历右子树
3)访问根结点
遍历的算法实现——先序遍历
算法:
Status PreOrderTraverse(BiTree T){
if(T==NULL) return OK;//空二叉树
else{
visit(T);//访问根结点
PreOrderTraverse(T->lchild);//递归遍历左子树
PreOrderTraverse(T->rchild);//递归遍历右子树
}
}
遍历的算法实现——中序遍历
算法:
Status InOrderTraverse(BiTree T){
if(T==NULL) return OK;//空二叉树
else{
InOrderTraverse(T->lchild);//递归遍历左子树
visit(T);//访问根结点
InOrderTraverse(T->rchild);//递归遍历右子树
}
}
遍历的算法实现——后序遍历
算法:
Status PostOrderTraverse(BiTree T){
if(T==NULL) return OK;//空二叉树
else{
PostOrderTraverse(T->lchild);//递归遍历左子树
PostOrderTraverse(T->rchild);//递归遍历右子树
visit(T);//访问根结点
}
}
遍历算法的分析:
如果去掉输出语句,从递归的角度看,三种算法是完全相同的,或说这三种算法的访问路径是相同的,只是访问结点的时机不同
时间效率:O(n)//每个结点只访问一次
空间效率:O(n)//栈占用的最大辅助空间
